欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总贴:历年蓝桥杯青少组Python中/高级选拔赛(STEMA)真题解析 | 汇总
【题目描述】
提示信息:
密码锁:由n个从左到右并排的圆环组成,每个圆环上都有10个个数字(0~9),蓝色框内为密码显示区,每个圆环在密码显示区只能显示一个数字,如图所示。可以拨动圆环,来改变密码显示区显示的数字。
当密码显示区的数字与密码一致时,密码锁就会被打开。
有一个由n个圆环组成的密码锁,和一个n位的密码S(S由1~9中的数字(包含1和9)组成)。每次操作只能选择一个或位置连续的多个圆环拨动。当S中的字符从左到右依次显示在密码显示区时,密码锁会被打开。
已知每个圆环在密码显示区初始数字都为0,请计算最少需要操作多少次,才能打开密码锁。
注意:
1、如果选择了其中一个圆环,可将该圆环中任意一个数字拨动到密码显示区,表示1次操作;
例如:将第3个圆环拨动到数字4,表示1 次操作:
2、如果选择了位置连续的多个圆环,只能将这些圆环拨动成同一个数字,显示在密码显示区,表示1次操作。
例如:将连续的第2个到第3个圆环都拨动到数字5,表示1次操作:
例如:
n=5,S=“12321”;分别表示5个圆环组成的密码锁和密码12321;将5位密码1、2、3、2、1从左到右依次显示在密码显示区,以下是操作次数最少的方案:
第一次操作,将5个初始状态为0的圆环全部拨动到数字1:
第二次操作,将第2个到第4个圆环全部拨动到数字2:
第三次操作,将第3个圆环拨动到数字3:
最少需要操作3次,才能打开密码锁。
【输入】
第一行输入一个整数n( 1 ≤ n ≤ 100 1\le n\le 100 1≤n≤100),表示组成的密码锁的圆环数及密码的位数
第二行输入一个长度为n的字符串 S,S 由1~9中的数字(包含1和9)组成,表示密码
输出描述:输出一个整数,表示最少需要操作多少次,才能打开密码锁
【输入样例】
5
12321
【输出样例】
3
【代码详解】
n=int(input())
s=list(map(int,input()))
a=[0 for i in range(105)]
for i in range(1, len(s)+1):
a[i] = s[i-1]
# print(a)
dp = [[0 for i in range(105)] for i in range(105)]
for i in range(1, n+1):
dp[i][i] = 1
for i in range(n, 0, -1):
for j in range(i+1, n+1):
dp[i][j] = dp[i][j-1] + 1
if a[j]==a[j-1]:
dp[i][j] = min(dp[i][j], dp[i][j-1])
if a[j]==a[i]:
dp[i][j] = min(dp[i][j], dp[i+1][j-1]+1)
if a[i]==a[i+1]:
dp[i][j] = min(dp[i][j], dp[i+1][j])
for k in range(i, j):
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j])
print(dp[1][n])
【运行结果】
5
12321
3