hdu4632 回文子序列

题:http://acm.hdu.edu.cn/showproblem.php?pid=4632

题意:问字符串的有多少个回文子序列(n<=10000)

分析:区间dp,考虑dp[i][j]表示i~j 位置含有多少个回文子序列,转移方程如代码

#include<bits/stdc++.h>
using namespace std;
const int M=1e3+3;
const int mod=10007;
int dp[M][M];
char s[M];
int main(){
    int t;
    scanf("%d",&t);
    for(int p=1;p<=t;p++){
        scanf("%s",s);
        int n=strlen(s);
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
            dp[i][i]=1;
        for(int i=0;i<n;i++)
            for(int j=i-1;j>=0;j--){
                dp[j][i]=(dp[j+1][i]+dp[j][i-1]-dp[j+1][i-1]+mod)%mod;
                if(s[i]==s[j])
                    dp[j][i]+=dp[j+1][i-1]+1;
                dp[j][i]%=mod;
            }
        printf("Case %d: %d\n",p,dp[0][n-1]);
    }
    return 0;
}
View Code

 

posted @ 2020-03-06 18:54  starve_to_death  阅读(99)  评论(0编辑  收藏  举报