坑爹!首先吐槽下,错了一个符号调试了我一个晚上!!然后想说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 }

浙公网安备 33010602011771号