题意:每一个“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\n",CASE,sum);
49 
50 
51   }
52   return 0  ;
53 }
View Code

 

posted on 2013-08-02 17:45  dark_dream  阅读(247)  评论(0编辑  收藏  举报