先上代码:
代码
#coding=utf-8
# 本题为考试单行多行输入输出规范示例,无需提交,不计分。
def solve():
s = input()
leng = len(s)
dp = [[0 for i in range(leng)] for i in range(leng)]
# print(dp)
for i in reversed(range(leng)):
dp[i][i] = 1
for j in range(i+1,leng):
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])
return dp[0][leng-1]
res = solve()
print(res)
题目比较简单,但是得保持题感才行。这是今天喜马拉雅的笔试中的编程题(搜索推荐算法)。
思想
设 dp[i][j]
表示为从i到j的序列的最长回文子序列,需要注意一下遍历的方向是从后往前,也就是如下矩阵的上三角部分:
如果对于一个长度为5的字符串,那么遍历的区间就是 [5,5]
=> [4,5]
=> [3,5]
… => [0,5]
递推公式比较简单,参考代码即可。