51Nod 1154 回文串划分

来源:互联网 发布:有思度软件 编辑:程序博客网 时间:2024/06/05 03:55

有一个字符串S,求S最少可以被划分为多少个回文串。
例如:abbaabaa,有多种划分方式。

a|bb|aabaa - 3 个回文串
a|bb|a|aba|a - 5 个回文串
a|b|b|a|a|b|a|a - 8 个回文串

其中第1种划分方式的划分数量最少。
Input
输入字符串S(S的长度<= 5000)。
Output
输出最少的划分数量。
Input示例
abbaabaa
Output示例
3
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define MAXN 5015char a[MAXN];int dp[MAXN];int main(){int n;while(scanf("%s",a+1)!=EOF) {n=strlen(a+1);dp[0]=0;for(int i=1;i<=n;i++)    dp[i]=1<<30;for(int i=1;i<=n;i++) {for(int j=i,k=i;j<=n&&k>0;j++,k--) //奇数{if(a[j]==a[k])    dp[j]=min(dp[j],dp[k-1]+1);else break;}for(int j=i+1,k=i;j<=n&&k>0;j++,k--) //偶数{if(a[j]==a[k])    dp[j]=min(dp[j],dp[k-1]+1);else break;}}printf("%d\n",dp[n]);}return 0;}


0 0