51Nod-1154 回文串划分
Posted 人间失格
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
题解:
这个题目,数据比较水,n^3可以过,首先,设dp[i]表示前i位的最少字符串数,所以dp[i]=min(dp[i],dp[j]+1)(j<i&&j+1~i是回文串),就是看前面一段用最优的,后面一段我们把他们用一个回文(如果可以的话)。
代码:
#include<iostream> #include<algorithm> #include<cstring> #include<stdlib.h> #include<stdio.h> #define MAXN 5010 using namespace std; char s[MAXN]; bool can[MAXN][MAXN]; int dp[MAXN]; bool check(int x,int y){ while(x!=y&&y>x){ if(s[x]==s[y]) x++,y--; else return 0; } return 1; } int main(){ scanf("%s",s+1); int n=strlen(s+1); memset(dp,127,sizeof(dp)); dp[0]=0; for(int i=1;i<=n;i++) for(int j=0;j<i;j++){ if(check(j+1,i)){ dp[i]=min(dp[i],dp[j]+1); } } printf("%d",dp[n]); }
以上是关于51Nod-1154 回文串划分的主要内容,如果未能解决你的问题,请参考以下文章