当前位置:   article > 正文

蓝桥杯-保险箱

蓝桥杯-保险箱
  1. """
  2. 题目来源:
  3. https://www.lanqiao.cn/problems/3545/learning/?page=1&first_category_id=1&name=%E4%BF%9D%E9%99%A9%E7%AE%B1
  4. """
  5. import os
  6. import sys
  7. # 请在此输入您的代码
  8. n = int(input())
  9. x = list(map(int, list(input())))[::-1]
  10. y = list(map(int, list(input())))[::-1]
  11. #
  12. dp = [[float('inf')] * 3 for _ in range(n)]
  13. # 不进位也不退位, 直接加或者减几个1, 比如当前位1变成9, 可以先加8个1变成9
  14. dp[0][0] = abs(x[0] - y[0])
  15. # 进位, 比如当前位9变成2, 可以先将当前位9进位变成0, 操作次数就是10 - x[0], 然后再直接加到2, 操作次数就是y[0]
  16. dp[0][1] = (10 - x[0]) + y[0]
  17. # 退位, 比如当前位2变成9, 可以先将当前位2退位变成0, 操作次数就是x[0], 然后再直接变成9, 操作次数就是10 - y[0]
  18. dp[0][2] = x[0] + (10 - y[0])
  19. for i in range(1, n):
  20. dp[i][0] = min(dp[i - 1][0] + abs(x[i] - y[i]), dp[i - 1][1] + abs((x[i] + 1) - y[i]), dp[i - 1][2] + abs((x[i] - 1) - y[i]))
  21. dp[i][1] = min(dp[i - 1][0] + 10 - x[i] + y[i], dp[i - 1][1] + 10 - (x[i] + 1) + y[i], dp[i - 1][2] + 10 - (x[i] - 1) + y[i])
  22. dp[i][2] = min(dp[i - 1][0] + 10 - y[i] + x[i], dp[i - 1][1] + 10 - y[i] + (x[i] + 1), dp[i - 1][2] + 10 - y[i] + (x[i] - 1))
  23. print(min(dp[n - 1][0], dp[n - 1][1], dp[n - 1][2]))
  24. """
  25. 就dp[i][0] = min(dp[i - 1][0] + abs(x[i] - y[i]), dp[i - 1][1] + abs((x[i] + 1) - y[i]), dp[i - 1][2] + abs((x[i] - 1) - y[i]))这个操作在这里解释一下具体含义:
  26. 1.dp[i][0]表示x的第i位不进行退位或者进位操作变成y的第i位的最少操作次数
  27. 2.dp[i - 1][0] + abs(x[i] - y[i]): dp[i - 1][0]是x的第i - 1位不进行退位或者进位操作变成y的第i - 1位的操作次数。
  28. 因为x的第i - 1没有进行进位或者退位操作, 那么x的第i位的数字不会加1或者减1, 则x的第i位变成y的第i位的操作次数也就是abs(x[i] - y[i])。
  29. 3.dp[i - 1][1] + abs((x[i] + 1) - y[i]): dp[i - 1][1]是x的第i - 1位通过进位操作变成y的第i - 1位的操作次数。
  30. 因为x的第i - 1有进位操作, 那么x的第i位的数字就会在原来的基础上加1, 则x的第i位变成y的第i位的操作次数也就是abs((x[i] + 1) - y[i])。
  31. 4.dp[i - 1][2] + abs((x[i] - 1) - y[i]): dp[i - 1][2]是x的第i - 1位通过退位操作变成y的第i - 1位的操作次数。
  32. 因为x的第i - 1有退位操作, 那么x的第i位的数字就会在原来的基础上减1, 则x的第i位变成y的第i位的操作次数也就是abs((x[i] - 1) - y[i])。
  33. 你需要明白低位的数字发生进位或者退位操作会影响高位的数字。
  34. """

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号