火车进站出站的问题满足卡特兰数...卡特兰数的相关知识如下:
卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
前几项为 (OEIS中的数列A000108): 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
令h(1)=1,h(2)=1,catalan数满足递归式:
例如:h(3)=h(1)*h(2)+h(2)*h(1)=1*1+1*1=2
h(4)=h(1)*h(3)+h(2)*h(2)+h(3)*h(1)=1*2+1*1+2*1=5
若h(0)=1;h(1)=1;h(2)=2;h(3)=5; ····有另类的递归式
另类递归式:
h(n)=h(n-1)*(4*n-2)/(n+1);
该递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=1,2,3,...)
可以看出卡特兰数是一个大数据的问题,处理大数据问题一般是将数据的各位存放在一个数组中....
1 //h( n ) = ( ( 4*n-2 )/( n+1 )*h( n-1 ) ); 2 3 4 #include<stdio.h> 5 6 //******************************* 7 //打表卡特兰数 8 //第 n个 卡特兰数存在a[n]中,a[n][0]表示长度; 9 //注意数是倒着存的,个位是 a[n][1] 输出时注意倒过来。 10 //********************************* 11 int a[105][100]; 12 void ktl() 13 { 14 int i,j,yu,len; 15 a[2][0]=1; 16 a[2][1]=2; 17 a[1][0]=1; 18 a[1][1]=1; 19 len=1; 20 for(i=3;i<101;i++) 21 { 22 yu=0; 23 for(j=1;j<=len;j++) 24 { 25 int t=(a[i-1][j])*(4*i-2)+yu; 26 yu=t/10; 27 a[i][j]=t%10; 28 } 29 while(yu) 30 { 31 a[i][++len]=yu%10; 32 yu/=10; 33 } 34 for(j=len;j>=1;j--) 35 { 36 int t=a[i][j]+yu*10; 37 a[i][j]=t/(i+1); 38 yu = t%(i+1); 39 } 40 while(!a[i][len]) 41 { 42 len--; 43 } 44 a[i][0]=len; 45 } 46 47 } 48 int main() 49 { 50 ktl(); 51 int n; 52 while(scanf("%d",&n)!=EOF) 53 { 54 for(int i=a[n][0];i>0;i--) 55 { 56 printf("%d",a[n][i]); 57 } 58 puts(""); 59 } 60 return 0; 61 }