51Nod 1154 回文串划分

有一个字符串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
#include
#include
using namespace std;
#define MAXN 5015

char 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;
}


你可能感兴趣的:(动态规划)