HDOJ 1023 Train Problem II 卡特兰数

火车进站出站的问题满足卡特兰数...卡特兰数的相关知识如下:

卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (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 }

 

转载于:https://www.cnblogs.com/kb342/p/3723272.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值