题意就是给定一个只有小写字母的字符串,要将这个字符串划分为尽可能少的回文串
状态转移方程就是dp[i] = min( dp[j-1]+1, dp[i]) (1<=j<=i,当s[i,j]是回文串的时候);
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
using namespace std;
const int maxn = 1005;
int dp[maxn];
char s[maxn];
int check(int l,int r){
for(;l<r;l++,r--)
if(s[l]!=s[r]) return false;
return true;
}
int min(int a,int b){return a>b?b:a;}
int main(){
int i,j,k,t;
cin>>t;
while(t--){
scanf("%s",s+1);
int len = strlen(s+1);
for(i=0;i<=maxn;i++)
dp[i] = 1005;
dp[0] = 0;
for(i=1;i<=len;i++){
for(j=1;j<=i;j++)
if(check(j,i))
dp[i] = min(dp[i],dp[j-1]+1);
}
cout<<dp[len]<<endl;
}
return 0;
}