Catalan数实例应用

卡特兰数的前几项(从第零项开始):

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(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)=C(2n, n) - C(2n, n-1);
C(0)=1,C(n)=C(n-1)
((4
n-2)/(n+1));

#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int catalan(int n)
{
	if(n==0||n==1)
		return 1;
	else
		return (4*n-2)*catalan(n-1)/(n + 1);
}
int main()
{
	for(int i=0;i<11;i++){
		printf("%d\n",catalan(i));
	}
	return 0;
}

运行结果为

1
1
2
5
14
42
132
429
1430
4862
16796

实例应用

1. 括号化问题。矩阵链乘: P=A1×A2×A3×……×An,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种
0对括号:[空序列] 1种可能
1对括号:() 1种可能
2对括号:()() (()) 2种可能
3对括号:((())) ()(()) ()()() (())() (()()) 5种可能

2. 在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形,不同的拆分数目用hn表之,hn即为Catalan数。例如五边形有如下五种拆分方案(图1),故h5=5。求对于一个任意的凸n边形相应的hn
图1
解:设Cn表示凸n边形的拆分方案数。由题目中的要求可知一个凸n边形的任意一条边都必然是一个三角形的一条边,边P1 Pn也不例外,再根据“不在同一直线上的三点可以确定一个三角形”,只要在P2,P3,……,Pn-1点中找一个点Pk(1<k<n),与P1、Pn 共同构成一个三角形的三个顶点,就将n边形分成了三个不相交的部分(如图3所示),我们分别称之为区域①、区域②、区域③,其中区域③必定是一个三角形,区域①是一个凸k边形,区域②是一个凸n-k+1边形,区域①的拆分方案总数是Ck,区域②的拆分方案数为Cn-k+1,故包含△P1PkPn的n 边形的拆分方案数为CkCn-k+1种,而Pk可以是P2,P3,……,Pn-1种任一点,根据加法原理,凸n边形的三角拆分方案总数为 ,同时考虑到计算的方便,约定边界条件C2=1。

3. 出栈次序问题。一个栈(无穷大)的进栈序列为1、2、3、…、n,有多少个不同的出栈序列?
类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

4. 给顶节点组成二叉树的问题。
  给定N个节点,能构成多少种形状不同的二叉树?
  先去一个点作为顶点,然后左边依次可以取0至N-1个相对应的,右边是N-1到0个,两两配对相乘,就是h(0)*h(n-1) + h(2)*h(n-2) +…+ h(n-1)h(0)=h(n)(能构成h(n)个)

好了

发布了36 篇原创文章 · 获赞 10 · 访问量 1934

猜你喜欢

转载自blog.csdn.net/weixin_44003265/article/details/95048253