卡特兰数

计算公式:

  $$h_{n} = h_{0} \cdot h_{n - 1} + h_{1} \cdot h_{h - 2} + ... + h_{n - 1} \cdot h_{0}$$
  $$h_{n} = h_{n - 1} \cdot (4n - 2) / (n + 1)$$
  $$h_{n} = \frac{1}{n + 1}\binom{2n}{n}$$
  $$h_{n} = \binom{2n}{n} - \binom{2n}{n+1}$$

相关定理与证明(此处\(C_n = h_n\))

定理1:对于一个由n个+1和n个-1构成的2n项序列,满足任意前缀和大于等于0的方案数,等于\(C_n\)
证明:用一一对应原则来证明:
  一个合法的出栈序列可以看做一串长为2n的01串,设1表示入栈,0表示出栈,那么合法序列必须满足对于任意位置,前缀中1的个数 >= 前缀中0的个数。
  如果不考虑这个限制,一个长为2n,有n个1,n个0的01串的数量为\(\binom{2n}{n}\).再考虑除去不合法的情况。
  对于任意不合法串,一定可以找到第一个使得串不合法的位置,恰好满足有\(m + 1\)个0,m 个1.那么这个位置后面就还有\(2n - m - 1 - m = 2(n - m) - 1\)个数,其中有\(n - m\)个1,\(n - m - 1\)个0.如果我们将后面这\(2(n - m) - 1\)个数01反转,那么后面就会有\(n - m\)个0,\(n - m - 1\)个1.与前面部分共同组成一个由\(n + 1\)个0和\(n - 1\)个1构成的01串。可以证明每一个这样的01串都恰好对应了一个不合法串。因此不合法串的方案数与这样的01串个数相同,即\(\binom{2n}{n + 1}\)
  那么合法的方案数即为\(\binom{2n}{n} - \binom{2n}{n + 1} = h_{n}\)

常用于求一些具有"相等"或"匹配"这个含义的计数问题(如出入栈,括号匹配等)。

常见应用

1,出栈序列方案数。

  思路:对于第一个出栈的元素k,可以看做k把1~n的序列分成了1~k - 1 和 k + 1 ~ n.分出来的小序列长度分别为k - 1和n - k.于是可以看做2个新的子问题。通过枚举k,可以得到
  \(f_{n} = f_{0} \cdot f_{n - 1} + f_{1} \cdot f_{n - 2} + ... + f_{n - 1} \cdot f_{0}\).即卡特兰数.
  相似的问题还有\(S = a_{1} \cdot a_{2} \cdot ... \cdot a_{n}\)这个表达式有多少种加括号的方式,也是可以枚举第一次加括号把剩下的部分分别分成了多大的2部分,然后变成2个子问题求解。
  还可以用一一对应原则来证明:
    一个合法的出栈序列可以看做一串长为2n的01串,设1表示入栈,0表示出栈,那么合法序列必须满足对于任意位置,前缀中1的个数 >= 前缀中0的个数。因为对于第2n个位置必须满足出栈 = 入栈,因此1有n个,0有n个。那么根据定理1即可得到答案。

2,括号匹配方案数

  n对括号的匹配方案数恰好为\(h_{n}\)
  思路:相当于有2n个符号,n个左括号,n个右括号。且每个左括号匹配时,必须使得被匹配上的右括号与当前左括号中间的字符数为偶数,否则就不合法了。
  于是可以枚举第一个被匹配上的括号是哪一个,若第0个与第1个匹配,那么剩下的2部分就是一个长度为0,一个长度为2n - 2,因此方案数为\(f_{0} \cdot f_{2n - 2}\),以此类推可以得到表达式\(f_{2n} = f_{0} \cdot f_{2n - 2} + f_{2} \cdot f_{2n - 4} + ... + f_{2n - 2} \cdot f_{0}\)
  算一下可以发现\(f_{2n} = h_{n}\).其实上面的出栈序列也可以看做一个元素即为一对括号,入栈 = 左括号,出栈 = 右括号。也可以采用同样的递推方式.

3,n个节点构成的二叉树个数

  方案数为\(h_{n}\)
  思路:首先root占一个点,然后枚举左右儿子分别有多少个点,最后的式子化出来即为卡特兰数

4,在圆上选择2n个点,将这些点分成很多个点对两两相连使得得到的n条线段不相交的方案数。

  方案数为\(h_{n}\).
  思路:类似与括号匹配问题,枚举一个点与哪个点匹配,将剩下的点分成了点数分别为多少的2个部分。因为要求线段两两不相交,所以被分割出来的每一部分的点数都必须为偶数,否则一定会有点被孤立出来并且必须跟另一部分连边。

5,凸多边形划分成多个三角形的方案数。

  方案数为\(h_{n - 2}\).
  思路:随意选一条边,然后在剩余顶点中随便选一个构成一个三角形,然后这个三角形把原图形分割成2部分,继续递归求解。

6,2n个人排队买票,票价5元,n个人有一张5元,n个人有1张10元。问使得每个有10元的人买票时都可以有零钱返还的方案数。

  方案数为\(h_{n}\)
  思路:类似与括号匹配,相当于每个10元的人,都必须在它前面有一个5元跟他匹配。于是就转化为了括号匹配问题。
  也可以转化为二维平面上的问题。从左下角走到右上角,向右走为5元,向上为10元,那么目的就是求从左下角走到右上角,不经过对角线的方案数。

7,用n个长方形填充一个高度为n的阶梯状图形的方法个数。

  20130503162403523.png
  方案数为\(h_{n}\).
  思路:不知道、、、、

posted @ 2018-11-08 16:09  ww3113306  阅读(256)  评论(0编辑  收藏  举报
知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。