看到一道题目如下:
有一个由 n 个圆环组成的密码锁,和一个 n 位的密码 S(S 由 1~9 中的数字组成,包含1和9)。每次操作只能选择一个或多个位置连续的圆环拨动。当 S 中的字符从左到右依次显示在密码显示区时,密码锁会被打开。
已知每个圆环在密码显示区初始数字都为 0,请计算最少需要操作多少次,才能打开密码锁。
n = int(input())
s = input()
s = ' ' + s
dp = [[0 for i in range(101)] for j in range(101)]
for j in range(1, n + 1):
for i in range(j, 0, -1):
if j == i:
dp[i][j] = 1
continue
dp[i][j] = dp[i][j - 1] + 1
if s[j] == s[j - 1]:
dp[i][j] = min(dp[i][j - 1], dp[i][j])
if s[j] == s[i]:
dp[i][j] = min(dp[i + 1][j - 1] + 1, dp[i][j])
if s[i] == s[i + 1]:
dp[i][j] = min(dp[i + 1][j], dp[i][j])
for k in range(i, j):
dp[i][j] = min(dp[i][k] + dp[k + 1][j], dp[i][j])
for i in range(1, n + 1):
for j in range(1, n + 1):
print(dp[i][j], end=' ')
print()
print(dp[1][n])
看了之后有点摸不着头脑,求解:
评论写不下可以私聊