赞
踩
- """
- 题目来源:
- https://www.lanqiao.cn/problems/3545/learning/?page=1&first_category_id=1&name=%E4%BF%9D%E9%99%A9%E7%AE%B1
- """
- import os
- import sys
-
- # 请在此输入您的代码
- n = int(input())
- x = list(map(int, list(input())))[::-1]
- y = list(map(int, list(input())))[::-1]
-
- #
- dp = [[float('inf')] * 3 for _ in range(n)]
- # 不进位也不退位, 直接加或者减几个1, 比如当前位1变成9, 可以先加8个1变成9
- dp[0][0] = abs(x[0] - y[0])
- # 进位, 比如当前位9变成2, 可以先将当前位9进位变成0, 操作次数就是10 - x[0], 然后再直接加到2, 操作次数就是y[0]
- dp[0][1] = (10 - x[0]) + y[0]
- # 退位, 比如当前位2变成9, 可以先将当前位2退位变成0, 操作次数就是x[0], 然后再直接变成9, 操作次数就是10 - y[0]
- dp[0][2] = x[0] + (10 - y[0])
-
- for i in range(1, n):
- 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]))
- 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])
- 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))
- print(min(dp[n - 1][0], dp[n - 1][1], dp[n - 1][2]))
- """
- 就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]))这个操作在这里解释一下具体含义:
- 1.dp[i][0]表示x的第i位不进行退位或者进位操作变成y的第i位的最少操作次数
- 2.dp[i - 1][0] + abs(x[i] - y[i]): dp[i - 1][0]是x的第i - 1位不进行退位或者进位操作变成y的第i - 1位的操作次数。
- 因为x的第i - 1没有进行进位或者退位操作, 那么x的第i位的数字不会加1或者减1, 则x的第i位变成y的第i位的操作次数也就是abs(x[i] - y[i])。
- 3.dp[i - 1][1] + abs((x[i] + 1) - y[i]): dp[i - 1][1]是x的第i - 1位通过进位操作变成y的第i - 1位的操作次数。
- 因为x的第i - 1有进位操作, 那么x的第i位的数字就会在原来的基础上加1, 则x的第i位变成y的第i位的操作次数也就是abs((x[i] + 1) - y[i])。
- 4.dp[i - 1][2] + abs((x[i] - 1) - y[i]): dp[i - 1][2]是x的第i - 1位通过退位操作变成y的第i - 1位的操作次数。
- 因为x的第i - 1有退位操作, 那么x的第i位的数字就会在原来的基础上减1, 则x的第i位变成y的第i位的操作次数也就是abs((x[i] - 1) - y[i])。
- 你需要明白低位的数字发生进位或者退位操作会影响高位的数字。
- """
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。