uva 11584 Partitioning by Palindromes 回文+dp

来源:互联网 发布:360全景效果图软件 编辑:程序博客网 时间:2024/06/06 02:14


dp[i]表示以i结尾的串最少可以分割的串数。

状态方程:dp[i] = min{ dp[j]+1, 串[j,i]是回文串&&1<=j<=i }


#include<stdio.h>#include<iostream>#include<math.h>#include<string.h>#include<iomanip>#include<stdlib.h>#include<ctype.h>#include<algorithm>#include<deque>#include<functional>#include<iterator>#include<vector>#include<list>#include<map>#include<queue>#include<set>#include<stack>#define CPY(A, B) memcpy(A, B, sizeof(A))typedef long long LL;typedef unsigned long long uLL;const int MOD = int (1e9) + 7;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f3f3f3f3f3f3fLL;const double EPS = 1e-9;const double OO = 1e20;const double PI = acos (-1.0);const int dx[] = {-1, 0, 1, 0};const int dy[] = {0, 1, 0, -1};using namespace std;const int maxn = 1010;char str[maxn];int dp[maxn];bool isPalind(int l,int r){    while(l<r){        if(str[l]!=str[r])return false;        ++l;--r;    }    return true;}int main() {    int T;scanf("%d",&T);    while(T--){        scanf("%s",str+1);        int len=strlen(str+1);        memset(dp,0,sizeof(dp));        for(int i=1;i<=len;i++){            dp[i]=i+1;            for(int j=1;j<=i;j++)if(isPalind(j,i)){//这里竟然漏了isPalind函数,呃WA一次                dp[i]=min(dp[i],dp[j-1]+1);            }        }        printf("%d\n",dp[len]);    }    return 0;}

0 0