卡特兰数

来源:互联网 发布:兰州大学网络教育专业 编辑:程序博客网 时间:2024/04/28 17:50

卡特兰数是组合数学中一个常出现在各种计数问题中的数列,
其前几项为 : 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(0)=1,h(1)=1,catalan数满足递推式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … + h(n-1)*h(0) (n>=2)

递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,…)

应用:
1、出栈次序:一个无穷大的栈,进栈次序是1,2,3 …… n , 不同的出栈次序有多少种?
假设最后出栈的数是 k, 比 k 早进早出的有 k-1个数,有 h(k-1),
比 k 晚进早出的有 n-k 个数, h(n-k).
所以对于 k ,h(k) = h(k-1)*h(n-k);
k 取不同的值时,产生的出栈序列是相互独立的,故累加结果是
h(n) = h(0)h(n-1) + h(1)h(n-2) + …..+ h(n-1)h(0);

2、凸多边形的划分:一个凸(n+2)边形,用直线连接他的两个顶点,使之分成多个三角形,每条直线不能相交,问有多少种划分方案?
首先固定一条边(即一个三角形),这个三角形可以将这个(n+2)边拆分成更小的多边形
区域赛系列一多边形划分
其实还不太懂为什么要用这个…..网上看卡特兰数的时候就有这个就用了……#include <stdio.h>
double fun(int m, int n){
int t = n;
double a = 1;
for(int i=m; i>=(m-n+1); i--){
a *= i;
a = a / t--;
}
return a;
}
int main(){
int n, m;
scanf("%d", &n);
for(int i=1; i<=n; i++){
scanf("%d", &m);
m -= 2;
double b = fun(2*m, m) / (m+1);
printf("Case #%d : %.0lf\n", i, b);
}
return 0;
}

3、二叉树的构成问题,有 n 个结点,问总共能构成集中不同的二叉树?
如果采用中序遍历的话,根结点第 k 个被访问到,则根结点的左子树有 k-1 个结点,根结点的右子树有 n-k 个结点,k 的取值范围是 1~n。
还有许多的应用,再慢慢儿加。

原创粉丝点击