胡扯Calalan数

Most Important Formulas

以下部分来自http://lanqi.org/skills/10939/

  1. C(n)=C2nnC2nn1C(n)=C_{2n}^n-C_{2n}^{n-1}

    Problem

    对于{1,2,..,n}\{1,2,..,n\}的进栈序列,有多少合法的出栈序列。

    Solution

    把进出栈看作事件,进栈记11,出栈记1-1,则一个事件序列的任意前缀和都0\ge 0 首先有nn11,先不管是否合法,只管总个数,那么序列的数目为C2nnC_{2n}^n 要从中减去不合法的,这样考虑: 每个不合法的序列,最先不合法的位置ii,一定是前缀和为1-11-111多了一个 那么把1..i1..i的数字全部取反,整个序列就有n+1n+111n1n-11-1。 记不合法的方案集合为II,存在n+1n+111n1n-11-1的序列集合为SS, 现在要证明的是II中的元素与SS中的元素构成一一映射。 首先,iI\forall i \in I,可以转换为唯一的sSs \in S 而对于sS\forall s \in S,如果从第二个前缀和为11的位置jj开始取反,那取反后第一个前缀和为1-1的位置必然不是jj,那这种不合法方案转化出对应的sSss' \in S \neq s,所以sS\forall s\in S一定唯一对应iIi\in I。 即不合法的方案数为C2nn1C_{2n}^{n-1}

    Another Example

    (搜到的一个解说三角划分方案数的图,似乎来自一个被封的csdn博客) 这样可以把三角划分转化为划分序列连乘顺序 序列连乘顺序可以转化为合法括号序列数目 然后就可以解决了

    Tips

    Catalan数是用映射来解决计数问题的。当有某种属性的方案不好统计的时候,就把这种方案的集合与其它比较容易统计的方案建立一一映射。这种转化思路大概即为其巧妙之处吧。

  2. C(n+1)=i=0nC(i)C(ni),C(0)=1C(n+1)=\sum\limits_{i=0}^nC(i)C(n-i),C(0)=1

    Problem

    圆周上有2n2n个点,以这些点为端点连互不相交的nn条弦,求不同连法的总数

    Solution

    考虑DP。 设f(i)f(i)表示ii个点时的答案,则f(0)=1f(0)=1,答案为f(2n)f(2n)。 显然,任意弦的两端点之间的优弧和劣弧上都一定有偶数个点 所以,f(i)=f(0)f(i2)+f(2)f(i4)+f(4)f(i6)+..+f(i2)f(2)f(i)=f(0)f(i-2)+f(2)f(i-4)+f(4)f(i-6)+..+f(i-2)f(2)2n2n代入,f(2n)=f(0)f(2n2)+f(2)f(2n4)+f(4)f(2n6)+..+f(2n2)f(0)f(2n)=f(0)f(2n-2)+f(2)f(2n-4)+f(4)f(2n-6)+..+f(2n-2)f(0) 考虑Catalan数的递推式 C(n)=C(0)C(n1)+C(1)C(n2)+C(2)C(n3)+...+C(n1)C(0)C(n)=C(0)C(n-1)+C(1)C(n-2)+C(2)C(n-3)+...+C(n-1)C(0) 可以看出f(2n)==C(n)f(2n)==C(n)

Other Examples

  1. nn个顶点的不同二叉树的个数是C(n)C(n)
  2. 2n2n个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,排列方式有C(n)C(n)
  3. a1,a2,...,ana_1,a_2,...,a_n为整数,且满足下列条件:
    • a11,a22,...,anna_1\le 1,a_2\le 2,...,a_n\le na1,a2,...,ana_1,a_2,...,a_n满足上述条件的序列的个数是C(n)C(n)
  4. a1,a2,...,ana_1,a_2,...,a_nb1,b2,...,bnb_1,b_2,...,b_n是两个完全不同的序列,则把这两个序列归并组成一个新的序列,恰有kk个逆序的方案数是C(n)C(n)(一个逆序是指aia_i排在bib_i的后面)。(想了很长时间不知道怎么证明)