蓝桥杯-保险箱

"""
题目来源:
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])。
你需要明白低位的数字发生进位或者退位操作会影响高位的数字。
"""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好无聊啊,烦死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值