zoukankan      html  css  js  c++  java
  • Catalan数

    今天看刘汝佳的白书《算法竞赛入门经典 训练指南》中写到,所以在网上学习了一下。

    简介  

    卡特兰数(Catalan),又称卡塔兰数,事组合数学中常出现在各种计数问题中的一个数列。以比利时数学家欧仁 查理 卡塔兰命名。

    其前几项为1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190....

     

    性质

    递推公式1:an = a0 * an-1 + a1 * an-2 + …....... + a(n-1) * a0 (a0 = 1)

    递推公式2:an = a(n-1) * (4*n-2) / (n+1)

    通项公式:an = C(2*n, n) / (n+1) 或者 an = C(2*n, n) - C(2*n, n+1)     (其中C为组合数)

    所有奇卡特兰数an都满足n = 2 ^ k - 1,其他卡特兰数都是偶数。


    公式证明

    用递推公式1证通项公式。

    法1:本人太笨,询问清华大学数院的WY大神得到以下证法:

    构造母函数f(x) = a0 + a1*x + a2*x^2......

    则递推式的左边事f(x)的n次项系数,递推式的右边是f(x)^2的n-1次项系数

    所以f(x)和x * f(x)的各次数 >= 1的各项系数相同

    再注意到常数项a0 = 1,有f(x) = x*f(x)^2 + 1,得到f(x) = (1 + sqrt(1-4*x)) / (2*x)

    而sqrt(1 - 4*x)泰勒展开式的n+1次项系数为2^(n+1) * (2*n - 1)!! / (n+1)!,

    那么f(x)的n次项系数就是2 ^ n * (2*n-1)!! / (n + 1)!,即C(n, 2*n) / (n + 1)

    得证。


    法2:见下面的应用3题,法一法二结合恰好得证。


    应用

    1、对于算式a1 * a2 * a3 *...* an,向其中添加括号,有多少中添加方案。

         答案:a(n-1)种


    2、对于一个凸n边形,用对角线将其划分为若干个三角形,有多少种划分方案。

         答案:an种


    3、一个无穷大的栈,按顺序向其中添加1, 2, 3, 4...n,问有多少种不同的出栈顺序。(比如可以1进栈,2进栈,2出栈,3进栈,3出栈,1出栈)

       这个问题即相当于下面问题——求满足下列条件的数列一共有多少个:条件一,由n个1和n个0组成的数列;条件二,对该数列从左向右扫描,任何时候扫到1的个数不少于扫到0的个数。

         法一:记所求为an。然后,用k记录第一个1的个数和0的个数相等的位置处1的个数,则对1 <= k <= n,an += a(k-1) * a(n-k)。即Catalan数的递推公式1。

         法二:所有由n个1和n个0组成的数列一共C(n, 2*n)种,从中删去不符合题意的。对所有不符合要求的数列,必然在某一奇数位2m+1位上首先出现 m+1 个 0 和 m 个 1( 0 比 1 多)。在该点之后有 n-m 个 1 和 n-m-1 个 0,把这些0和1互换,则整个数列成为一个由 n+1 个0和 n-1 个1组成的数列。用类似的方法可以证明,n+1 个 0 和 n-1 个 1 组成的数列也可以转化成 n 个 1 和 n 个 0 组成的数列,他们一一对应。故,不符条件的数列一共有C (n+1, 2*n)个。

         故所求为C (n, 2*n) - C (n+1, 2*n)。即Catalan数的通项公式。


    4、有 n 个 1 和 m 个 -1排成一个数列,满足对所有0<=k<=n+m的前k个数的部分和Sk > 0的排列数。

         提示:问题等价为在一个格点阵列中,从(0,0)点走到(n,m)点且不经过对角线x==y的方法数(x > y)。


    5、有 n 个 1 和 m 个 -1排成一个数列,满足对所有0<=k<=n+m的前k个数的部分和Sk >= 0的排列数。

         提示:类似上题。

    4,5确实为很好的两道题,只是过程在百度百科已经叙述得比较不错了,我就不再赘述。

    参考资料

    百度百科http://baike.baidu.com/view/2499752.htm#refIndex_2_2499752

    维基百科http://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0

    http://www.cppblog.com/abilitytao/archive/2010/04/12/112371.html    

    题目:

    1、UVALive 5028/HDU 3723 Delta Wave

    题解:http://www.cnblogs.com/plumrain/p/counting.html

    ------------------------------------------------------------------
    现在的你,在干什么呢?
    你是不是还记得,你说你想成为岩哥那样的人。
  • 相关阅读:
    数据库
    Activity组件
    view,视图组件
    360导航板式
    service音乐播放
    service
    音乐播放器组件
    获取时间字符串
    JDK服务器存储
    数据库_黑名单练习_完善服务广播
  • 原文地址:https://www.cnblogs.com/plumrain/p/catalan.html
Copyright © 2011-2022 走看看