题目思想大概是这样:cabbeaf:回文子序列有:c,a,aa,bb,,aba,abba,e,f,最长的就是abba,所以输出长度为4
状态转移关系如下:
#include <iostream>
#include <algorithm>
#include <string>
int dp[1000][1000];
using namespace std;
int main(){//思路就是求这个原字符串和它反转字符串的最长公共子序列
string str;
cin>>str;
string a=str;
reverse(a.begin(),a.end());
int len=str.length();
for(int i=1;i<=len;i++){
for(int j=1;j<=len;j++){
if(str[i-1]==a[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[len][len];
return 0;
}