题意:每一个“hehe”子串都可以看成另一个意思,问一个句子最多能有多少个意思
解题思路:dp,如果有连续的hehe 把每个hehe当成一个石头,那么就可以抽象成从n个连续的时候中抽出k个石头,且两两不相邻,对于从第二个石头开始的石头,他的结果取决于 取或不取 它前面那个石头的结果 所以 dp[1][i] = d[2][i-1] ; dp[2][i] = d[1][i-1] 所以 dpsum[I] = dpsum[i-1] + dpsum[i-2];是个斐波那契数列。
解题代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #define MAXN 10087 6 char str[MAXN]; 7 int a[MAXN]; 8 void ready() 9 { 10 a[1] = 2; 11 a[2] = 3; 12 13 for(int i = 3;i <= 10086 ; i++) 14 { 15 a[i] = (a[i-1] + a[i-2])% 10007; 16 } 17 } 18 19 int main() 20 { 21 int t ; 22 scanf("%d",&t); 23 ready(); 24 25 for(int CASE = 1; CASE <= t; CASE ++) 26 { 27 scanf("%s",str); 28 int len = strlen(str); 29 int sub = 0;; 30 int sum = 1 ; 31 for(int i = 0 ;i < len ;) 32 { 33 if(str[i] == 'h' && str[i+1] == 'e'&&str[i+2] == 'h' && str[i+3] == 'e') 34 { 35 sub ++; 36 i =i + 2; 37 } 38 else 39 { 40 if(sub != 0 ) 41 sum *= a[sub]; 42 sum = sum % 10007; 43 sub = 0 ; 44 i ++; 45 } 46 } 47 48 printf("Case %d: %d ",CASE,sum); 49 50 51 } 52 return 0 ; 53 }