题目大意:求出所给字符串中的最长回文子序列长度
分析:动规。
状态:dp[i][j]——i~j的最长回文子序列长度
结果:dp[0][s.size()-1]
初始化:dp[i][i]=1
状态转移方程: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]}
还可以求原字符串和逆序字符串的LCS,但是这种解法效率不高。
代码:转载自https://blog.csdn.net/xiaocong1990/article/details/54976319
class Solution{
public:
int longestPalindromeSubseq(string s)
{
vector<vector<int>> dp(s.length(),vector<int>(s.length(),1));
for(int i = s.length() - 1;i >= 0;i--){
for(int j = i + 1;j < s.length();j++){
if(s[i] == s[j])
dp[i][j] = (j - i >= 2 ? dp[i + 1][j - 1] : 0) + 2;
else
dp[i][j] = max(dp[i + 1][j],dp[i][j - 1]);
}
}
return dp[0][s.length()-1];
}
};