UVA 11584 【简单dp】

题意:求一个字符串最少由多少个回文串组成。

分析:定义dp[i][j]前i由多少回文串组成。转移方程dp[i]=min(dp[i],dp[j-1]+1).

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 2005
#define Mm 2010
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int dp[Mn];char s[Mn];
int judge(int j,int i) {
    while(j<=i&&s[j]==s[i]) j++,i--;
    return j>=i;
}
int main() {
    int T;
    scanf("%d",&T);
    getchar();
    while(T--) {
        scanf("%s",s+1);
        int n=strlen(s+1);
        CLR(dp,0x3f);
        dp[0]=0;
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=i;j++) {
                if(judge(j,i)) dp[i]=min(dp[i],dp[j-1]+1);
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}


你可能感兴趣的:(UVA 11584 【简单dp】)