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

HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

时间:2014-08-18 10:36:34      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   ar   

题目

 

 

参考自博客:http://blog.csdn.net/u011498819/article/details/38356675

 

 

题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数。

简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就

知道了,若已经知道【0,i】,推【0,i+1】, 显然还要从i+1 处往回找,dp方程也简单: 
dp[j][i]=(dp[j+1][i]+dp[j][i-1]+10007-dp[j+1][i-1])%10007; 减去中间一段重复的 
if(s[i]==s[j])dp[j][i]=(dp[j][i]+dp[j+1][i-1]+1)%10007;  这里不忘记,新加入的和结尾构成的情况。

 

 

bubuko.com,布布扣
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
int dp[1010][1010];//dp[i][j]  i~j之间的回文串数目
int main()
{
    int t;
    scanf("%d",&t);
    for(int id=1;id<=t;id++)
    {
        char s[1010];
        scanf("%s",s);
        int len=strlen(s);
        memset(dp,0,sizeof(dp));
        for(int i=0;i<len;i++)
            dp[i][i]=1;

        for(int i=0;i<len;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]+10007)%10007;//忘记模了。。。
                if(s[i]==s[j])
                    dp[j][i]=(1+dp[j+1][i-1]+dp[j][i])%10007;//忘记模了。。。
            }
        }
        printf("Case %d: %d\n",id,dp[0][len-1]%10007);
    }
    return 0;
}
View Code

 

HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理),布布扣,bubuko.com

HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

标签:style   blog   http   color   os   io   for   ar   

原文地址:http://www.cnblogs.com/laiba2004/p/3918765.html

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