回文串划分
有一个字符串S,求S最少可以被划分为多少个回文串。
例如:abbaabaa,有多种划分方式。
a|bb|aabaa - 3 个回文串
a|bb|a|aba|a - 5 个回文串
a|b|b|a|a|b|a|a - 8 个回文串
其中第1种划分方式的划分数量最少。
abbaabaa
3
【分析】用dp[i]存放从1~i的最小划分数量
dp[i] = min(dp[i],dp[j-1]+1) j~i为回文
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define cl(a,b) memset(a,b,sizeof a);
const int maxn = 5*1e3 + 10;
char s[maxn];
int dp[maxn];
int judge(int i,int j)
{
while(i<=j){
if(s[i]!=s[j])
return 0;
i++;
j--;
}
return 1;
}
int main()
{
s[0] = ' ';
while(~scanf("%s",s+1)){
int len = strlen(s);
for(int i=0;i<=len;i++){
dp[i] = i;
}
for(int i=1;i<len;i++){
dp[i] = min(dp[i],dp[i-1]+1);
for(int j=1;j<i;j++){
if(judge(j,i)){
dp[i] = min(dp[i],dp[j-1]+1);
}
}
}
printf("%d\n",dp[len-1]);
}
return 0;
}