坑爹!首先吐槽下,错了一个符号调试了我一个晚上!!然后想说DP方程有时候真不容易想出来…………下面贴出代码,以作纪念。

View Code
 1 /*{
 2 ID:jzy3209981
 3 PROG:nocows
 4 LANG:C++
 5 }*/
 6 #include<stdio.h>
 7 #include<iostream>
 8 #include<string.h>
 9 #include<math.h>
10 using namespace std;
11 
12 int kind[200][100];
13 int work(int n,int h)
14 {
15     int i,j,result=0,k;
16     if(n==3&&h==2)
17         return 1;
18     for(i=1;i<  (n+1)/2;i+=2)
19         for(j=(int)(log((double)i)/log(2)+1);j<=(i+1)/2;j++)
20         {
21             if(j<h-1&&h-1<=(n-i)/2)
22             {
23                 result+=(((kind[i][j]*kind[n-i-1][h-1])%9901*2)%9901);
24                 result%=9901;
25             }
26             else if(j==h-1&&i==n-i-1)
27             {
28                 result+=((kind[i][j]*kind[i][j])%9901);
29                 result%=9901;
30             }
31             else if(j==h-1)
32             {
33                 for(k=(int)(log((double)(n-i-1))/log(2)+1);k<=(n-i)/2&&k<=j;k++)
34                 {
35                     result+=(((kind[i][j]*kind[n-1-i][k])%9901*2)%9901);
36                     result%=9901;
37                 }
38             }
39         }
40     return result;
41 }    
42 int main()
43 {
44     freopen ("nocows.in","r",stdin);
45     freopen ("nocows.out","w",stdout);
46     int n,h,i,j;
47     scanf("%d%d",&n,&h);
48     kind[1][1]=1;
49     for(i=3;i<=n;i+=2)
50         for(j=(int)(log((double)i)/log(2)+1);j<=(i+1)/2;j++)
51         {        
52             if(j==(int)(log((double)(i+1))/log(2)))
53                 kind[i][j]=1;
54             else
55                 kind[i][j]=work(i,j);
56         }
57     printf("%d\n",kind[n][h]%9901);
58     return 0;
59 }

 

posted on 2012-07-25 21:27  醉春雨  阅读(210)  评论(0)    收藏  举报