这两天,做了四五道关于卡塔兰数的问题,觉得应该总结一下吧。
关于卡塔兰数的一些介绍:
http://www.cppblog.com/MiYu/archive/2010/08/07/122573.html1)卡塔兰数是组合数学中一个常出现在各种计数问题中出现的数例。由比利时的数学家欧仁·查理·卡塔兰(1814-1894)命名。
2)卡塔兰数是由递推公式而来,其递推公式如下:
h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2);
还可以化简为1阶递推关系: 如h(n)=(4n-2)/(n+1)*h(n-1)(n>1) h(0)=1
通项式是:
h(n)= C(2n,n)/(n+1)=P(2n,n)/(n+1)!=(2n)!/(n!*(n+1)1!) (n=1,2,3,...) 3)最近做的题目,应用到卡塔兰数主要的有:
1、n个点组成二叉树的种类
2、一个栈的进出栈的方案总数
3、一个圆内2*n个点两两连线且不相互交叉的方案数
4、正n边形用对角线割分成三角形的方案数
5、P=a1*a2*......*an加括号的不同方案数
6、2n个物品分成a,b两种,且a个数小于b的方案数。
.................
*这些只是我最近所见到的,但是还有更多的类型等着去发现,最最重要的是能够根据题目的描述得到递推式,再由递推式得到有关卡塔兰数的规律。
4)题目:poj 2084 HDOJ 1134 HDOJ 1131 HDOJ 1130
.....
这里面最重要的还是有关高精度的处理,附上MIYU的模版一份
1
#include <iostream>
2
#include <cstdio>
3
#include <algorithm>
4
#include <cstring>
5
6
using namespace std;
7
#define MAX 105
8
#define BASE 10000
9
typedef int myType[MAX+10];
10
void multiply ( int a[], int Max, int b ) //大数乘小数
11

{ int i,array=0;
12
for (i=Max-1; i>=0; i--)
13
{
14
array+=b*a[i];
15
a[i] = array%BASE;
16
array /= BASE;
17
}
18
}
19
void divide ( int a[], int Max, int b ) //大数除小数
20

{
21
int i,div=0;
22
for (i=0;i<Max; i++)
23
{
24
div = div*BASE + a[i];
25
a[i] = div / b;
26
div %= b;
27
}
28
}
29
void outPut ( myType ctl[MAX] ,int N )
30

{
31
int i = 0;
32
while ( i < MAX && ctl[N][i] == 0 )
33
{
34
i ++ ; //去前导0
35
}
36
cout << ctl[N][i++];
37
while ( i < MAX )
38
{
39
40
printf ( "%04d", ctl[N][i++] );
41
}
42
cout << endl;
43
}
44
void setNum ( myType ctl[MAX] )
45

{
46
memset ( ctl[1], 0, MAX * sizeof ( int ) );
47
ctl[1][MAX-1] = 1;
48
for ( int i = 2; i < 101; i ++ )
49
{
50
memcpy ( ctl[i], ctl[i-1], MAX * sizeof ( int ) );
51
multiply ( ctl[i], MAX, 4 * i - 2 );
52
divide ( ctl[i], MAX, i + 1 );
53
}
54
}
55
myType ctl[MAX];
56
int main()
57

{
58
setNum ( ctl );
59
int N;
60
while ( cin >> N ) // 这里根据各题要求需要做相应变化
61
{ outPut ( ctl, N ); }
62
return 0;
63
}
64