卡特兰(Catalan)数入门详解


基本概念

介绍
学卡特兰数我觉得可能比组合数要难一点,因为组合数可以很明确的告诉你那个公式是在干什么,而卡特兰数却像是在用大量例子来解释什么时卡特兰数
这里,我对卡特兰数做一点自己的理解
卡特兰数是一个在组合数学里经常出现的一个数列,它并没有一个具体的意义,却是一个十分常见的数学规律

对卡特兰数的初步理解:有一些操作,这些操作有着一定的限制,如一种操作数不能超过另外一种操作数,或者两种操作不能有交集等,这些操作的合法操作顺序的数量

为了区分组合数,这里用fn表示卡特兰数的第n项
从零开始,卡特兰数的前几项为 1 , 1 , 2 , 5 , 14 , 42 , 132 , 429 , 1430 , 4862 , 16796 , 58786 , 208012 , 742900 , 2674440 , 9694845 , 35357670 , 129644790 … 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790… 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790


定义

递归定义

f n = f 0 ∗ f n − 1 + f 1 ∗ f n − 2 + … + f n − 1 f 0 fn=f0∗fn−1+f1∗fn−2+…+fn−1f0 fn=f0fn1+f1fn2++fn1f0,其中 n ≥ 2 n≥2 n2

递推关系

f n = 4 n − 2 n + 1 f n − 1 f_n=\frac{4n−2}{n+1}fn−1 fn=n+14n2fn1

通项公式

f n = 1 n + 1 C 2 n n fn=\frac{1}{n+1}C_{2n}^n fn=n+11C2nn

经化简后可得

f n = C 2 n n − C 2 n n − 1 fn=C_{2n}^n−C_{2n}^{n-1} fn=C2nnC2nn1

只要我们在解决问题时得到了上面的一个关系,那么你就已经解决了这个问题,因为他们都是卡特兰数列


实际问题

先用一个最经典的问题来帮助理解卡特兰数
去掉了所有的掩饰,将问题直接写出来就是

例题1
在一个w×h的网格上,你最开始在(0,0)上,你每个单位时间可以向上走一格,或者向右走一格,在任意一个时刻,你往右走的次数都不能少于往上走的次数,问走到(n,m),0≤n有多少种不同的合法路径。

合法路径个数为 f n = C 2 n n − C 2 n n − 1 fn=C_{2n}^n−C_{2n}^{n-1} fn=C2nnC2nn1
直接求不好,考虑求有多少种不合法路径
路径总数为在2n次移动中选n次向上移动,即Cn2n

画一下图,我们把y=x+1这条线画出来,发现所有的合法路径都是不能碰到这条线的,碰到即说明是一条不合法路径
先随便画一条碰到这条线的不合法路径,所有的不合法路径都会与这条线有至少一个交点,我们把第一个交点设为(a,a+1)
如图

p1.png

我们把 ( a , a + 1 ) (a,a+1) (a,a+1)之后的路径全部按照 y = x + 1 y=x+1 y=x+1这条线对称过去
这样,最后的终点就会变成 ( n − 1 , n + 1 ) (n−1,n+1) (n1,n+1)
p2.png

由于所有的不合法路径一定会与 y = x + 1 y=x+1 y=x+1有这么一个交点
我们可以得出,所有不合法路径对称后都唯一对应着一条到 ( n − 1 , n + 1 ) (n−1,n+1) (n1,n+1)的路径
且所有到 ( n − 1 , n + 1 ) (n−1,n+1) (n1,n+1)的一条路径都唯一对应着一条不合法路径(只需将其对称回去即可)
所以不合法路径总数是 C n − 12 n Cn−12n Cn12n

那么合法的路径总数为 C n 2 n − C n − 12 n Cn2n−Cn−12n Cn2nCn12n

这是一个非常好用且重要的一个方法,其它的问题也可以用该方法解决
即找到不合法路径唯一对应的到另一个点的路径
如网格计数


01序列
你现在有n个0和n个1,问有多少个长度为2n的序列,使得序列的任意一个前缀中1的个数都大于等于0的个数
例如n=2时
1100 , 1010 1100,1010 1100,1010两种合法序列
1001 , 0101 , 0110 , 0011 1001,0101,0110,0011 1001,0101,0110,0011都是不合法的序列

合法的序列个数为 C n 2 n − C n − 12 n Cn2n−Cn−12n Cn2nCn12n

我们把出现一个1看做向右走一格,出现一个1看做向上走一格,那么这个问题就和上面的例题1一模一样了

拓展
如果是 n 个 1 , m 个 0 n个1,m个0 n1,m0呢?
不过是最后的终点变为了 ( n , m ) (n,m) (n,m)罢了
如果是1的个数不能够比m少k呢
我们只需将 y = x + 1 y=x+1 y=x+1这条线上下移动即可


括号匹配
你有n个左括号,n个右括号,问有多少个长度为2n的括号序列使得所有的括号都是合法的

合法的序列个数为 C n 2 n − C n − 12 n Cn2n−Cn−12n Cn2nCn12n

要使所有的括号合法,实际上就是在每一个前缀中左括号的数量都不少于右括号的数量
将左括号看做1,右括号看做0,这题又和上面那题一模一样了


进出栈问题
有一个栈,我们有2n次操作,n次进栈,n次出栈,问有多少中合法的进出栈序列

合法的序列个数为 C n 2 n − C n − 12 n Cn2n−Cn−12n Cn2nCn12n

要使序列合法,在任何一个前缀中进栈次数都不能少于出栈次数…
后面就不用我说了吧,和上面的问题又是一模一样的了


312排列
一个长度为n的排列a,只要满足 i < j < k i<j<k i<j<k a j < a k < a i aj<ak<ai aj<ak<ai就称这个排列为312排列
求n的全排列中不是312排列的排列个数

答案也是卡特兰数

我们考虑312排列有什么样的特征
如果考虑一个排列能否被1,2,3,…,n−1,n排列用进栈出栈来表示
那么312排列就是所有不能被表示出来的排列
那么这个问题就被转化成进出栈问题了


不相交弦问题
在一个圆周上分布着 2n个点,两两配对,并在这两个点之间连一条弦,要求所得的2n条弦彼此不相交的配对方案数
当n=4时,一种合法的配对方案为如图
p3.png

合法的序列个数为Cn2n−Cn−12n

这个问题没有上面的问题那么显然,我们规定一个点为初始点,然后规定一个方向为正方向
如规定最上面那个点为初始点,逆时针方向为正方向
然后我们把一个匹配第一次遇到的点(称为起点)旁边写一个左括号(,一个匹配第二次遇到的点(称为终点)旁边写一个右括号)
如图

p4.png

看出来吗,在规定了这样的一个顺序后,在任意一个前缀中起点的个数都不能少于终点的个数
于是这又是一个卡特兰数列了


二叉树的构成问题
有n个点,问用这n个点最终能构成多少二叉树

答案仍然是卡特兰数列

这个问题不是用上面的方法,是用递归定义的卡特兰数

一个二叉树分为根节点,左子树,右子树
其中左子树和右子树也是二叉树,左右子树节点个数加起来等于n−1
设i个点能构成fi个二叉树
我们枚举左子树有几个点可得
f n = f 0 ∗ f n − 1 + f 1 ∗ f n − 2 + … + f n − 1 ∗ f 0 fn=f0∗fn−1+f1∗fn−2+…+fn−1∗f0 fn=f0fn1+f1fn2++fn1f0
这个和卡特兰数列的递归定义是一模一样的


凸多边形的三角划分
一个凸的n边形,用直线连接他的两个顶点使之分成多个三角形,每条直线不能相交,问一共有多少种划分方案

答案还是卡特兰数列

我们在凸多边形中随便挑两个顶点连一条边,这个凸多边形就会被分成两个小凸多边形,由于每条直线不能相交,接下来我们就只要求这两个小凸多边形的划分方案然后乘起来即可

和二叉树的构成问题一样,我们枚举大凸多边形被分成的两个小凸多边形的大小即可

阶梯的矩形划分
一个阶梯可以被若干个矩形拼出来
图示是两种划分方式

p5.png

p6.png

像下图是不合法的划分方式
p7.png


问,一个n阶矩形有多少种矩形划分

答案仍然是卡特兰数列

我们考虑阶梯的每个角

如图
p8.png

每个角一定是属于不同的矩形的,我们考虑和左下角属于一个矩形的是哪个角
这个矩形将这个梯形又分成两个小梯形,如图

p9.png

于是我们又可以写出递推式了
和卡特兰数列的递归式是一样的…


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值