hdu4632 区间dp

Posted a_clown_cz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

hdu4632(区间dp)

HDU 4632 Palindrome subsequence(区间DP求回文子序列数)

HDU4632 Palindrome subsequence 题解 区间DP

hdu4632 Palindrome subsequence 回文子序列个数 区间dp

hdu4632 回文子序列

hdu-4632 Palindrome subsequence (回文子序列计数)