UVa11584

题目大意

给定一个小写字母组成的字符串S,你的任务是划分成尽量少的回文串

题解

方程就是dp[j]=min(dp[i-1]+1)(i<=j,s[i..j]是回文串)

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 1005
char s[MAXN];
int dp[MAXN];
bool check(int l,int r)
{
    int len=(l+r)/2;
    for(int i=l; i<=len; i++)
        if(s[i]!=s[r-i+l]) return false;
    return true;
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",s+1);
        int len=strlen(s+1);
        for(int i=1; i<=len+1; i++)
            dp[i]=1005;
        dp[0]=0;
        for(int i=1; i<=len; i++)
        {
            for(int j=1; j<=i; j++)
                if(check(j,i))
                    dp[i]=min(dp[i],dp[j-1]+1);
        }
        printf("%d
",dp[len]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zjbztianya/p/3246091.html