題意:求最長迴文子序列。
思路:狀態dp(i,j)表示從i到j的最長迴文子序列長度,那麼
dp(i,j)=dp(i+1,j-1)+2,str[i]==str[j]
dp(i,j)=max(dp(i+1,j),dp(i,j-1)),str[i]!=str[j]
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[1010][1010];
char t[1010];
int main()
{
int T;
cin>>T;getchar();
while(T--){
cin.getline(t,1000);
int len=strlen(t);
if(len<2) {cout<<len<<endl;continue;}
memset(dp,0,sizeof(dp));
for(int i=1;i<=len;i++) dp[i][i]=1;
for(int l=2;l<=len;l++)
for(int j,i=1;(j=i+l-1)<=len;i++)
if(t[i-1]==t[j-1]) dp[i][j]=dp[i+1][j-1]+2;
else dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
cout<<dp[1][len]<<endl;
}
return 0;
}