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 回文串划分的主要内容,如果未能解决你的问题,请参考以下文章

b_51_回文串划分(预处理+dp)

51nod_1154 回文串的划分

回文串划分

1154 回文串划分(DP+Manacher)

Uva 11584,划分成回文串

UVa 11584 划分成回文串