• 卡特兰数


    计算公式:

      $$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}).
      思路:不知道、、、、

  • 相关阅读:
    阅读《Android 从入门到精通》(29)——四大布局
    UISegmentedControl 修改字体大小 和 颜色
    UITableView Scroll to top 手动设置tableview 滚动到 顶部
    xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cycle” in ARC-enabled code
    iOS key value coding kvc在接收json数据与 model封装中的使用
    NSData 转 bytes 字节数据
    git commit 出现 changes not staged for commit 错误
    iOS exit(),abort(),assert()函数区别
    ios 程序发布使用xcode工具Application Loader 正在通过ITUNES STORE进行鉴定错误
    iOS mac添加证书 不能修改“System Roots”钥匙串错误
  • 原文地址:https://www.cnblogs.com/ww3113306/p/9929706.html
Copyright © 2020-2023  润新知