卡特兰数

卡特兰数是组合数学中一个常出现在各种计数问题中的数列,
其前几项为 : 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。
还有许多的应用,再慢慢儿加。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值