【51nod】1154 回文串划分

来源:互联网 发布:2015电商彩妆销售数据 编辑:程序博客网 时间:2024/06/05 02:29

题目:

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1154

扫描回文串的每个中心,寻找他的回文串,用DP来记录更新;
状态方程dp[j]=min(dp[j],dp[k-1]+1);
看前面一段用最优的,后面一段是回文+1。

代码:

//状态方程dp[j]=min(dp[j],dp[k-1]+1); #include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;const int MAXN=5010;const int inf=0x3f3f3f3f;char a[MAXN];int dp[MAXN];int main(){    int i,j,k,n;    cin>>a+1;    n=strlen(a+1);    //初始化,比较最小    for(i=1;i<=n;i++)    {        dp[i]=inf;    }    //i控制从中心开始,判断是否是回文;    for(i=1;i<=n;i++)    {        for(j=i,k=i;j<=n&&k>0;j++,k--)        {            //j从自身开始判断再往后,k往前确定字符;回文为奇数时            if(a[j]==a[k])               dp[j]=min(dp[j],dp[k-1]+1);            else                break;        }        for(j=i+1,k=i;j<=n&&k>0;j++,k--)        {            //j从自身后一位开始判断再往后;回文为偶数时            if(a[j]==a[k])               dp[j]=min(dp[j],dp[k-1]+1);            else                break;        }    }    cout<<dp[n]<<endl;    return 0;}

原创粉丝点击