代码视频及来源:
放寒假了,蓝桥杯怎么准备 | 每日一题 | AcWing 5408. 保险箱_哔哩哔哩_bilibili
问题描述
小蓝有一个保险箱,保险箱上共有n位数字
小蓝可以任意调整保险箱上的每个数字,每一次操作可以将其中一位增加1或减少1。
当某位原本为9或0时可能会向前(左边)进位/退位,当最高位(左边第一位)上的数字变化时向前的进位或退位忽略
例如: 00000的第5位减1变为 99999; 99999的第5位减1变为99998;00000的第4位减1变为99990;97993的第4位加1变为98003:99909的第3位加1变为00009
保险箱上一开始有一个数字a,小蓝希望把它变成y,这样才能打开它,问小蓝最少需要操作的次数。
输入格式
输入的第一行包含一个整数n。
第二行包含一个n位整数。
第三行包含一个n位整数y。
输出格式
输出一行包含一个整数表示答案
import os
import sys
#https://www.bilibili.com/video/BV1u94y1M7HU/?spm_id_from=333.337.search-card.all.click&vd_source=dd04fffeb7894a8a703070ebf26af762
# 请在此输入您的代码
import sys
N = 100010
a = [0] * N
b = [0] * N
f = [[sys.maxsize] * 3 for _ in range(N)] # sys.maxsize代表一个较大的数,类似C++中的0x3f3f3f3f
n = int(input())
str1 = input()
str2 = input()
for i in range(len(str1)):
a[i] = int(str1[i])
b[i] = int(str2[i])
f[n][1] = 0 #索引从0开始所以变为0,1,2
for i in range(n - 1, -1, -1):
for j in range(3): #j是进位状态,原本是-1,0,1 ,但索引从0开始所以变为0,1,2
for k in range(-9, 10): #k是每一位操作的次数 -9-9
for t in range(-1, 2): #t是进位/借位/不进不借 -1,0,1
if a[i] + k + t - b[i] == (j - 1) * 10: #a[i]+k+t表示变完后的最终结果,式子表示该位最终结果减去目标值对上一位的影响(-10,0,10)
f[i][j] = min(f[i][j], f[i + 1][t + 1] + abs(k))
print(min(min(f[0][0], f[0][1]), f[0][2]))