历年蓝桥杯Python青少组中/高级选拔赛(STEMA)真题解析 | 2024年1月编程题(11)

学习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 1n100),表示组成的密码锁的圆环数及密码的位数

第二行输入一个长度为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
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值