"""
题目来源:
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])。
你需要明白低位的数字发生进位或者退位操作会影响高位的数字。
"""
蓝桥杯-保险箱
于 2024-03-24 11:44:17 首次发布