描述
题目链接
有一个字符串S,求S最少可以被划分为多少个回文串。例如abbaabaa,有多种划分方式。
a|bb|aabaa-3个回文串
a|bb|a|aba|a-5个回文串
a|b|b|a|a|b|a|a-8个回文串
其中第一种划分方式的划分数量最少。
输入:abbaabaa
输出:3
题解
dp[i]表示前i位最少回文串数量
代码
#include <iostream>
#include<stdio.h>
using namespace std;
#define maxn 5005
#include<string.h>
char s[maxn];
int dp[maxn];
bool judge(int start,int end_){
while(start!=end_&&start<end_){
if(s[start]==s[end_]){
start++;
end_--;
}
else
return 0;
}
return 1;
}
int main()
{
while(scanf("%s",s+1)==1){
int len=strlen(s+1);
for(int i=1;i<=len;i++){
dp[i]=999999;
}
dp[0]=0;
dp[1]=1;
for(int i=2;i<=len;i++){
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]);
}
return 0;
}