51nod_1154 回文串的划分

Posted 六花的邪王真眼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod_1154 回文串的划分相关的知识,希望对你有一定的参考价值。

说实话。。最开始看这题感觉一定好难。。。好高大上。。。我的马拉车还不熟。。。。这种。。但是本着做不出来也要至少看看的心态,吧个题看完了。。然后简单的想了想,好像是个挺直观的动态规划,因为看到数据几乎就像是得到了提示:ON2可以过哟,想想双重FOR循环吧~~这样诱人的声音。

但是后面我做完之后看着提。。。似乎我给写了个ON3的代码。。。居然还过了。。。。

定义DP[K]代表[0,K]内划分的子串的个数,状态转移为DP[J]=MIN(DP[K]+1(如果K,J是回文))。

 

#include<bits/stdc++.h>
using namespace std;

const long long INF=1e12+2333;
const long long MAXN=5233;
long long dp[MAXN];
char str[MAXN];

bool check(int pos1,int pos2)
{
    for(int i=pos1,j=pos2;i<=j;i++,j--)
    {
        if(str[i]!=str[j])return false;
        
    }return true;
}

int main()
{
    scanf("%s",(str+1));
    int len=strlen(str+1);
    dp[0]=0;
    for(int i=1;i<=len;++i)
    {
        long  long ans=INF;
        for(int j=1;j<=i;++j)
        {
            if(check(j,i))
            {
                ans=min(ans,dp[j-1]+1);
            }
        }
        dp[i]=ans;
    }
    cout<<dp[len];
    return 0;
}

 

以上是关于51nod_1154 回文串的划分的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1154 dp

51 nod 1088 最长回文子串

1154 回文串划分(DP+Manacher)

51nod 1092(lcs)回文字符串

51nod1089最长回文子串V2

51 Nod 1089 最长回文子串(Manacher算法)