杭电1023
题目:As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway.
Analyse:用动态规划的思想,dp[n]为n列火车能排成的排列数,从结果看,如果火车1前面有x列火车,则这x列火车为火车2到火车x+1,而这x列火车的排列数为dp[x],火车1后面的n-x-1列火车的排列数为dp[n-x-1],因此将火车1的位置列举出来得到dp[n]=sigma(dp[i]*dp[n-i-1])(i=0,1,2,........,n)。然后此题的关键就在于把大数相加和相乘的问题解决。
 View Code
View Code 
1 #include<stdio.h> 2 #define INTLEN 17 3 struct BigInt 4 { 5 int digit[INTLEN]; 6 int len; 7 }; 8 struct BigInt temp; 9 void add(struct BigInt *a,struct BigInt *b,struct BigInt *c) 10 { 11 int carry; 12 int i; 13 struct BigInt *swaptemp; 14 if(a->len < b->len) 15 { 16 swaptemp=a; 17 a=b; 18 b=swaptemp; 19 } 20 temp.len=a->len; 21 carry=0; 22 for(i=0;i<b->len;i++) 23 { 24 temp.digit[i]=(a->digit[i]+b->digit[i]+carry)%10000; 25 carry=(a->digit[i]+b->digit[i]+carry)/10000; 26 } 27 for(;i<a->len;i++) 28 { 29 temp.digit[i]=(a->digit[i]+carry)%10000; 30 carry=(a->digit[i]+carry)/10000; 31 } 32 if(carry) 33 { 34 temp.digit[i]=carry; 35 temp.len++; 36 } 37 //转移 38 for(i=0;i<temp.len;i++) 39 c->digit[i]=temp.digit[i]; 40 c->len=temp.len; 41 } 42 //this function is based on the add function 43 struct BigInt inter,multiresult; 44 void multiply(struct BigInt *a,struct BigInt *b,struct BigInt *c) 45 { 46 int i,j,carry; 47 c->digit[0]=0; 48 c->len=1; 49 for(i=0;i<b->len;i++) 50 { 51 carry=0; 52 for(j=0;j<INTLEN;j++) 53 inter.digit[j]=0; 54 for(j=0;j<a->len;j++) 55 { 56 inter.digit[i+j]=(a->digit[j]*b->digit[i]+carry)%10000; 57 carry=(a->digit[j]*b->digit[i]+carry)/10000; 58 if(i+j+1>inter.len && inter.digit[i+j]!=0) 59 inter.len=i+j+1; 60 } 61 if(carry) 62 { 63 inter.digit[i+j]=carry; 64 inter.len=i+j+1; 65 } 66 add(&inter,c,c); 67 } 68 } 69 int main() 70 { 71 struct BigInt dp[105]; 72 int i,j,n; 73 dp[0].digit[0]=1; 74 dp[0].len=1; 75 for(i=1;i<101;i++) 76 { 77 dp[i].len=1; 78 dp[i].digit[0]=0; 79 for(j=0;j<i;j++) 80 { 81 multiply(&dp[j],&dp[i-j-1],&multiresult); 82 add(&multiresult,&dp[i],&dp[i]); 83 } 84 } 85 while(scanf("%d",&n)!=EOF) 86 { 87 i=dp[n].len-1; 88 printf("%d",dp[n].digit[i]); 89 for(i--;i>=0;i--) 90 printf("%04d",dp[n].digit[i]); 91 printf("\n"); 92 } 93 return 0; 94 }
 
                    
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号