首页 > 代码库 > hdu4632 区间dp

hdu4632 区间dp

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4632

题意:求回文串子串的的个数。

思路:看转移方程就能理解了。

 

dp[i][j] 表示区间i j 之间的回文子串的个数。

状态转移方程:dp[i][j]=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1];
             if(str[i]==str[j]) dp[i][j]=dp[i][j]+dp[i+1][j-1]+1;

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=1e3+5;
const int INF=0x3f3f3f3f;
const int MOD=10007;

int dp[maxn][maxn];
char str[maxn];

int main(){
    //freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    for(int t=1;t<=T;t++){
        memset(dp,0,sizeof(dp));
        scanf("%s",str+1);
        int n=strlen(str+1);
        for(int i=1;i<=n;i++) dp[i][i]=1;   //单个字母肯定是回文串
        for(int d=1;d<n;d++)
        for(int i=1;i+d<=n;i++){
            int j=i+d;
            dp[i][j]=(dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]+MOD)%MOD;
            if(str[i]==str[j]) dp[i][j]=(dp[i][j]+dp[i+1][j-1]+1+MOD)%MOD;
        }
        printf("Case %d: %d\n",t,dp[1][n]);
    }
    return 0;
}

 

hdu4632 区间dp