经典的回文串区间dp
注意没说串不包含空格就很有可能会有空格
#include<cstdio>
#include<cstring>
#include<cstring>
#include<iostream>
#define MAX 1010
using namespace std;
char s[MAX];
int dp[MAX][MAX];
void init(){
for(int i=0;i<MAX;i++){
for(int j=0;j<MAX;j++){
dp[i][j]=MAX;
if(i==j)
dp[i][j]=0;
}
}
}
int main(){
int T;
scanf("%d",&T);
getchar();
while(T--){
gets(s);
int len=strlen(s);
init();
for(int l=2;l<=len;l++){
for(int i=0;i<=len-l;i++){
if(s[i]==s[i+l-1]){
if(l==2)
dp[i][i+l-1]=0;
else
dp[i][i+l-1]=min(dp[i+1][i+l-2],dp[i][i+l-1]);
}
dp[i][i+l-1]=min(dp[i][i+l-1],dp[i+1][i+l-1]+1);
dp[i][i+l-1]=min(dp[i][i+l-1],dp[i][i+l-2]+1);
//if(l>2)
// dp[i][i+l-1]=min(dp[i][i+l-1],dp[i+1][i+l-2]+2);
}
}
cout<<len-dp[0][len-1]<<endl;
}
return 0;
}