51nod1154回文串划分

这道题目刚开始想错了,本来打算每次找到最大的回文串,结果自己给自己驳倒了,比如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;
}

你可能感兴趣的:(dp,51nod)