最长回文字串,首先既然回文,则首尾相等,所以只需要找到两个相等的元素
a[j][j+k]=max(a[j+1][j+k-1]+2,max(a[j][j+k-1],a[j+1][j+k]));//状态转移
若不想等
a[j][j+k] = max(a[j+1][j+k],a[j][j+k-1]);
class Solution {
public:
int longestPalindromeSubseq(string s) {
if(s.size()==1)
return 1;
int a[s.size()][s.size()]={0};
for(int i=0;i<s.size();i++)
a[i][i]=1;
for(int k=1;k<s.size();k++){
for(int j=0;j+k<s.size();j++){
if(s[j]==s[j+k]){
if(k==1)
a[j][j+k]=a[j][j]+1;
else
a[j][j+k]=max(a[j+1][j+k-1]+2,max(a[j][j+k-1],a[j+1][j+k]));
}
else{
a[j][j+k] = max(a[j+1][j+k],a[j][j+k-1]);
}
}
}
return a[0][s.size()-1];
}
};