51nod1154回文串划分

来源:互联网 发布:烤漆哑铃知乎 编辑:程序博客网 时间:2024/06/05 08:34

这道题目刚开始想错了,本来打算每次找到最大的回文串,结果自己给自己驳倒了,比如dabbbbbdb,最长回文子串是bbbbb,结果四个落单,一共是五个,而如果把最后的bdb放在一组,就一目了然了,4个,所以这种是不行的,到底该如何做呢
dp[j]代表了读到第j个字符的时候出现的回文串最小有多少个
k

#include <iostream>using namespace std;const int INF=0x3f3f3f3f;string s;int dp[5005];int main(){    while(cin>>s)    {        for(int i=1; i<=5005; i++)            dp[i]=INF;            s=" "+s;        dp[0]=0;        for(int i=1; i<s.size(); i++)        {                for(int j=i,k=i; j<s.size()&&k>0; j++,k--)                {                    if(s[j]==s[k])                        dp[j]=min(dp[j],dp[k-1]+1);                        else break;                }//奇数回文串                for(int j=i+1,k=i;j<s.size()&&k>0; j++,k--)                {                    if(s[j]==s[k])                        dp[j]=min(dp[j],dp[k-1]+1);                       else break;                }//偶数回文串        }        cout<<dp[s.size()-1]<<endl;    }    return 0;}
0 0
原创粉丝点击