状态:d[i]表示前i个字符所组成的最少回文串。状态转移:d[i]=min(d[j]|s[j+1:i]是回文串)
#include<bits/stdc++.h>
#define INF 1<<30
using namespace std;
char s[1005];
int d[1005];
bool check(int l,int r){
while(l<r){
if(s[l++]!=s[r--]){
return false;
}
}
return true;
}
int main(void){
int t;
cin>>t;
while(t--){
scanf("%s",s+1);
d[0]=0;
int n=strlen(s+1);
for(int i=1;i<=n;i++) d[i]=INF;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
if(check(j+1,i)){
d[i]=min(d[i],d[j]+1);
}
}
}
printf("%d\n",d[n]);
}
}