Partitioning by Palindromes
简单dp,类似于背包问题.
总体思路:取(i,j)这一段,如果验证其为回文串(扫一遍),则dp[i]=min(dp[i],dp[j-1]+1).dp[i]是到i这一点回文串的个数
代码:
#include <bits/stdc++.h>
#define ll long long
#define maxn 1008
#define INF 0x3f3f3f3f
using namespace std;
char s[maxn];
int dp[maxn];
int hui(int begin,int end){
for(int i=begin,j=end;i<=j;i++,j--){
if(s[i]!=s[j])
return 0;
}
return 1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",s+1);
int len=strlen(s+1);
dp[0]=0;
for(int i=1;i<=len;i++){
dp[i] = INF;
for(int j=i;j>=1;j--) {
int flag = hui(j, i);
if(flag)
dp[i]=min( dp[j-1]+1, dp[i] );
}
}
printf("%d\n",dp[len]);
}
return 0;
}