HDU 4639 Hehe(字符串动态规划)
2013-08-02 15:56
190 查看
题意:给定一串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]中包含了)
思路:对于连续的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 10090 int 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; }
相关文章推荐
- HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)
- 100道动态规划——20 HDU 1257 最少拦截系统 LIS 啊!我为什么这个都没有想到!
- HDU 2191—悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 动态规划入门
- hdu 1159 Common Subsequence(动态规划:最长公共子序列)
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
- hdu 3401 单调队列优化动态规划
- pku2192---Zipper(动态规划题,随机组合两个字符串)
- 动态规划hdu Max Sum
- 动态规划训练17 [Super Jumping! Jumping! Jumping! HDU - 1087 ]
- 动态规划 hdu 1978 How many ways
- 动态规划 1. HDU 1003 Max Sum
- HDU动态规划部分题目统计
- leetcode动态规划之字符串切割成语句,单词都在字符串数组中
- hdu 4433 locker(动态规划:枚举状态)
- 动态规划:HDU-1203-0-1背包问题:I NEED A OFFER!
- hdu1069 Monkey and Banana 一个简单的动态规划
- HDU 1421(搬寝室)动态规划
- 2988:计算字符串距离(2.6基本算法之动态规划)
- 动态规划:HDU1789-Doing Homework again
- 动态规划求数组中和最大字串的值 以及 字符串的循环移位(要求空间复杂度O(1),时间复杂度O(n))