7届省赛java试题 10: 密码脱落

密码脱落


X星球的考古学家发现了一批古代留下来的密码。这些密码是由A、B、C、D 四种植物的种子串成的序列。仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
输入一行,表示现在看到的密码串(长度不大于1000)
要求输出一个正整数,表示至少脱落了多少个种子。
例如,输入:
ABCBA
则程序应该输出:
0
再例如,输入:
ABDCDCBABC
则程序应该输出:
3

思路:

我们先创建二维列表dp[i][j] ,dp表示s[i:j+1],e表示我们选字符的长度,因为当字符长度为1时他本身就是回文字符,所以dp[i][j]=1,i,j在遍历我们选择e长度所有连续字符,我们先不管他满不满足回文字符让dp[i][j]=max(dp[i+1][j],dp[i][j-1]),如何if s[i]==s[j]: 我们就判断dp[i][j]本身和dp[i+1][j-1]因为s[i][j]相等所有要+2,dp[i+1][j-1]+2。那么n-dp[0][n-1]就是我们的答案。

程序:

s=input()
n=len(s)
dp=[[0 for i in range(n)]for i in range(n)]
for e  in range(1,n+1):
    i=0
    while i+e-1<n:
        j=i+e-1
        if e==1:
            dp[i][j]=1
            i+=1
            continue
        dp[i][j]=max(dp[i+1][j],dp[i][j-1])
        if s[i]==s[j]:
            dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2)
        i+=1

print(n-dp[0][n-1])

禁止转载。仅用于自己学习。对程序错误不负责。

猜你喜欢

转载自blog.csdn.net/weixin_46640345/article/details/112528416
今日推荐