UVA 11584 划分回文字串

将其划分为尽可能少的回文串


dp[i] = min(dp[i],dp[j] + 1)    来表示j+1~i是回文串

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 0x3f3f3f3f
using namespace std;
char p[1005];
bool work(int i,int j)
{
    for(int k = 0; k <=(j-i)/2; k++)
        if(p[i+k] != p[j-k])
            return false;
    return true;
}
int dp[1005];
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        getchar();
        scanf("%s",p);
        int  len = strlen(p);
        for(int i = 0;i < len;i++)
            dp[i] = i+1;              //回文串为单个字母的情况
        for(int i = 0;i < len;i++)
        if(work(0,i))
            dp[i] = 1;                //包含首位的回文串
        for(int i = 0; i < len; i++)
            for(int j = 0; j < i; j++)
                if(work(j+1,i))       //j+1   从第二位开始判断
                    dp[i] = min(dp[i],dp[j] + 1);   
        printf("%d\n",dp[len-1]);
    }
    return 0;
}

  

posted @ 2015-07-20 14:52  Przz  阅读(170)  评论(0编辑  收藏  举报