最长回文子序列问题(动态规划python代码)
问题描述:求解一段字符串中的最长回文子序列
注意子序列和子串的区别: 子序列是指可以不连续的字符,而子串为连续字符
动态规划三要点:
(1)dp定义:dp[i][j]:为s[i] 到s[j]的最长回文子序列
(2)转移方程:
(1)dp[i][j]= dp[i+1] [j-1]+2 #当s[i]=s[j]时就为中间的最长回文子序列加上两端新加入的两个字符
(2)dp[i][j]=max(dp[i+1][j] ,dp[i][j-1]) #当s[i]!=s[j] 时,就取两个中较大的一个回文子序列
(3)初始状态:
dp=[[0 for i in range(len(s))] for j in range(len(s))] #全部初始为0
for i in range(len(s)): #dp[i][i]代表以s[i]开始,以s[i]结束的最长回文子序列,就是其本身,因此设为1
dp[i][i]=1
(4)循环代码的写法:需要让i从末尾往前循环
s="cbbd"
dp=[[0 for i in range(len(s))] for j in range(len(s))]
for i in range(len(s)):
dp[i][i]=1
for i in range(len(s)-1,-1,-1):
for j in range(i+1,len(s)):
if(s[i]==s[j]):
dp[i][j]=dp[i+1][j-1]+2
else:
dp[i][j]=max(dp[i+1][j],dp[i][j-1])
print(dp[0][len(s)-1])