【UVA】11584-Partitioning by Palindromes(动态规划)

来源:互联网 发布:什么软件有电视直播 编辑:程序博客网 时间:2024/05/15 10:51

动态规划。

如果 j + 1 ~ i是回文,那么

dp[i] = min=(dp[j] + 1); 

判断j + 1~ i是不是回文可以进行预处理,方法是枚举中心,之后向两边伸张,(需要枚举2次,一次是偶数回文,一次是奇数回文)

1399325311584Partitioning by PalindromesAcceptedC++0.1322014-08-05 08:27:39

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<map>#include<stack>#include<queue>#include<set>#include<ctime>#include<cmath>#include<string>#include<iomanip>#include<climits>#include<cctype>#include<deque>#include<list>#include<sstream>#include<vector>#include<cstdlib>using namespace std;#define _PI acos(-1.0)#define INF (1 << 20)typedef long long LL;typedef unsigned long long ULL;typedef pair<int,int> pill;/*======================================*/#define MAXD 1000 + 10char str[MAXD];int  s[MAXD][MAXD]; /*i ~ j是不是回文串*/int  dp[MAXD];void init(){    scanf("%s",str + 1);    int L = strlen(str + 1);    memset(s,0,sizeof(s));    /*枚举中心,奇数回文*/    for(int i = 1; i <= L ;i++){        for(int j = i , k = i; j >= 1 && k <= L ; j--,k++){            if(str[j] == str[k])                s[j][k] = 1;            else                break;        }    }    /*枚举中心,偶数回文*/    for(int i = 1; i <= L ;i++){        for(int j = i , k = i + 1; j >= 1 && k <= L ; j--,k++){            if(str[j] == str[k])                s[j][k] = 1;            else                break;        }    }    dp[0] = 0;    for(int i = 1; i <= L ; i++)        dp[i] = INF;    return ;}void DP(){    int L = strlen(str + 1);    for(int i = 1; i <= L ; i++)        for(int j = 0 ; j < i; j++){             if(s[j + 1][i]){                dp[i] = min(dp[i],dp[j] + 1);             }        }    printf("%d\n",dp[L]);}int main(){    int T;    scanf("%d",&T);    while(T--){        init();  /*预处理*/        DP();    }    return 0;}

0 0
原创粉丝点击