码迷,mamicode.com
首页 > 其他好文 > 详细

hdu4632 区间dp

时间:2016-11-17 14:03:46      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:i+1   blog   printf   har   style   name   字母   mem   eof   

题目链接: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

标签:i+1   blog   printf   har   style   name   字母   mem   eof   

原文地址:http://www.cnblogs.com/a-clown/p/6073309.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!