有一个字符串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]); }
时间: 2024-09-29 03:44:05