UVa11584 - Partitioning by Palindromes(区间DP)

题目大意

给定一个小写字母组成的字符串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\n",dp[len]);

    }

    return 0;

}

你可能感兴趣的:(partition)