杭电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
 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 }
posted @ 2012-07-17 10:24  Hogg  阅读(437)  评论(0)    收藏  举报