HDU 4639 Hehe(字符串动态规划)

来源:互联网 发布:豆角台剧网下载软件 编辑:程序博客网 时间:2024/04/28 04:42

题意:给定一串T串字符串,每个hehe可能有两种意思,要么是就是hehe,要么是wqnmlgb,现在要问这串字符串的意思的可能数模10007

思路:对于连续的he,可以推导,f[i]代表连续i个he表达意思的可能数,f[i]=f[i-1]+f[i-2]。然后,将不同的连续he串之间的可能数相乘即可。(组合原理)

(其实不是通过直接观察得出满足斐波那契数列的,可以推导的)

连续i个he表达可能数,由两部分组成,一部分是:最后一个he独立出来,前面i-1个he自由变换hehe和wqnmlgb(情况数为f[i-1]);另一部分是,最后两个he翻译成wqnmlgb,而前面i-2个he自由变换hehe和wqnmlgb(情况数为f[i-2])。(注意:不应该再考虑最后两个he仍然是hehe的情况,因为这个已经在f[i-1]中包含了)

#include<cstdio>#include<cstring>#define M 10007#define MAXN 10090int ca=0,T,f[MAXN],ans;char str[MAXN];void prework(){    f[1]=1;f[2]=2;    for(int i=3;i<MAXN;++i) f[i]=(f[i-1]+f[i-2])%M;}int main(){    prework();    scanf("%d",&T);    while(T--)    {        ans=1;        scanf("%s",str);        int n=strlen(str);        int low=0,high;        while(low<n-1)        {            if(str[low]=='h' && str[low+1]=='e')            {                high=low+2;                while(high<n-1 && str[high]=='h' && str[high+1]=='e') high+=2;//寻找hehe串,最后使得str[low]到str[high-1]全部是he                ans=(ans*f[(high-low)/2])%M;//he的个数等于(high-low)/2                low=high;            }            else low++;        }        printf("Case %d: %d\n",++ca,ans%M);    }    return 0;}


原创粉丝点击