卡特兰数

计算公式:

  $$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}inom{2n}{n}$$
  $$h_{n} = inom{2n}{n} - inom{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串的数量为(inom{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串个数相同,即(inom{2n}{n + 1})
  那么合法的方案数即为(inom{2n}{n} - inom{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}).
  思路:不知道、、、、

原文地址:https://www.cnblogs.com/ww3113306/p/9929706.html