卡特兰数的证明以及应用

出栈序列计数问题

给定一长为n的序列,各位元素各不相同,那么经过入栈,出栈后,可以得到多少种不同的序列。

这个问题的答案是卡特兰数C(n)

卡特兰数

卡特兰数是中一个常在各种计数问题中出现的数列。用C(n)表示卡特兰数第n项,则有通项公式

\[C(n)=C_{2n}^n-C_{2n}^{n+1}=\frac{C_{2n}^n}{n+1}=\frac{(2n)!}{(n+1)!n!} \]

有递推公式

\[C(0)=1 \qquad and\qquad C(n+1)=\frac{2(2n+1)}{n+2}C(n) \]

证明

长为n的序列,每个元素需要入栈一次,出栈一次,以0表示入栈,1表示出栈。则出入栈操作可以由一个长为2n01串唯一表示。这个01串需符合以下条件:

  1. 其中01的数量均为n

  2. 对于任意位置i[1,i]位置的子串中,出现的1的个数不大于0的个数(栈的性质,未入栈不可出栈)。

可以用容斥原理统计符合条件的01串。

首先易得符合条件1的01串个数为C(2n,n)

其中不符合条件2的串一定有: 对于某个位置2i+1[1,2i+1]出现的1的个数为i+10的个数为i

又此串符合条件1,那么剩余位置的0,1个数分别为n-i,n-i-1

如果将剩余位置的1变为00变为1。那么这个串就变成了一个由n-10n+11组成的串。

设符合条件1但不符合条件2的串构成集合N,由n-10n+11组成的01串构成集合M

由于01互换操作是一个一一映射函数,故MN之间存在一个一一映射,故M,N元素个数相等(映射的性质)。

故卡特兰数的通项公式为C(2n,n)-C(2n,n+1)

这种思想称为映射计数法。

一些可以用卡特兰数的问题

  1. (0,0)(n,n)的不越过直线y=x的非降路径数

  2. n个节点的不同构的二叉树的数量

  3. n+2边形分割为n个三角形的方法数

  4. n对括号排列组成的合法的括号序列个数

posted @ 2021-10-19 22:42  cryingrain  阅读(1205)  评论(0编辑  收藏  举报