hdu 4632区间dp

来源:互联网 发布:歼十外销知乎 编辑:程序博客网 时间:2024/05/17 21:44

给你一个字符串  让你求最大回文子序列的个数;dp【i】【j】表示i到j的最大回文子序列个数(注意是个数,就要有累加过程  如果是最大长度  就直接赋值)  

首先dp【i】【j】=dp【i+1】【j】+dp【i】【j-1】 中间有重复的()就是与i+1余j-1无关的   所以还得减去dp【i+1】【j-1】

然后判断str【i】与str【j】是否相等,如果是再加上dp【i+1】【j-1】+1;


#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;#define mod 10007int dp[1010][1010];int max(int a,int b){    return a>b?a:b;}int main(){    int T,i,j,n,d=1;    char str[1010];    scanf("%d",&T);    while(T--)    {        scanf("%s",str);        int len=strlen(str);        memset(dp,0,sizeof(dp));        for(i=len-1;i>=0;i--)        {            for(j=i;j<len;j++)            {                dp[i][j]=(dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+mod)%mod;                if(str[i]==str[j]) dp[i][j]=(1+dp[i+1][j-1]+dp[i][j])%mod;            }        }        printf("Case %d: %d\n",d++,dp[0][len-1]);        }    return 0;}

0 0