zoukankan      html  css  js  c++  java
  • 卡特兰数

    递推式

    [C_0 = 1, C_1 = 1, C_n = sumlimits_{i = 0}^{n - 1} C_i imes C_{n - i - 1} (n ge 2) ]

    应用

    二叉树个数

    (n)个结点的二叉树个数。

    (f_0 = 1)

    (n ge 1),枚举根结点有(i)个左儿子,那就有(n - i - 1)个右儿子,根据加法原理和乘法原理,(f_i = sumlimits_{i = 0}^{n - 1} f_i imes f_{n - i - 1})
    这和卡特兰数递推公式是一样的。

    括号序列个数

    (n)对括号的合法括号序列个数。

    (f_0 = 1)

    (n ge 1),合法括号序列的第一个元素一定是左括号,那么就有与之配对的右括号,那么它们都可也写成((A)B)的形式,(A, B)都为合法的括号序列,那我们枚举(A)中的括号对数,根据加法原理和乘法原理,有(f_n = sumlimits_{i = 0}^{n - 1} f_i imes f_{n - i - 1})
    这和卡特兰数递推公式也是一样的。

    出栈序列个数

    其实它和括号序列是等价的,进栈相当于左括号,出栈相当于右括号。

    凸多边形三角划分个数

    将一个凸(n)多边形划分成(n - 2)个三角形的方案数。

    (f_3 = 1),为了方便计算,我们假设(f_2 = 1)

    (n > 3),不失一般性的,我们随意选择一条边,这条边一定是某个三角形上的一条边,枚举这个三角形的第3个点,根据加法原理和乘法原理,有(f_n = sumlimits_{i = 3}^{n} f_{i - 1} imes f_{n - i + 2})
    (h_{n} = f_{n + 2}),则有(h_n = sumlimits_{i = 0}^{n - 1} h_{i} imes h_{n - i - 1})
    这和卡特兰数递推公式也是一样的。

    组合意义下的通项公式

    用括号序列去证明。
    要求对于任意前缀,左括号数量大于等于右括号数量。
    我们把括号序对应到坐标上,每放一个左括号,就向上走一步,每放一个右括号,就向右走一步。

    如下如:

    显然,一个括号序列(左右括号数量合法的括号序列)就是一条从S到G的路径。如果这条路径不经过图中的圆圈,那么它对应的括号序列就是合法的。

    这总共有(inom{2n}{n})个。

    接下来我们应该把其中不合法的减掉。
    任意一条不合法的路径至少经过一个圆圈。
    对于一条这样的路径,当它经过圆圈后,我们把它的路径对所有圆圈所在直线作对称,也就是说,当它经过圆圈后,它原本向右就变成向上,原本向上就变成向右。

    如下图:

    显然,任意条S到G'的路径都对应了一个不合法的括号序列,任意一个不合法的括号序列都对应了一条S到G'的路径,所以不合法的括号序列是(inom{2n}{n + 1})

    所以卡特兰数的通向公式就是(C_n = inom{2n}{n} - inom{2n}{n + 1} = frac{1}{n + 1} inom{2n}{n})

  • 相关阅读:
    K3Wise K3List.OCX引入dotnet问题处理方法
    k3wise dotnet开发老单据时序簿工具条添加按钮
    c#调用dotnet写的com组件碰到注册失败的错误的补救方法
    bat注册dotnet com
    dotnet动态加载以及卸载dll的代码
    c#获取com对象的progid
    jpg和png的区别
    Fragment的FragmentTransaction 的commit()和commitAllowingStateLoss()以及commitNow()和commitNowAllowingStateLoss()
    Java泛型类型擦除与运行时类型获取
    rxjava介绍
  • 原文地址:https://www.cnblogs.com/tkandi/p/10479315.html
Copyright © 2011-2022 走看看