zoukankan      html  css  js  c++  java
  • 卡特兰数(Catalan Number) 学习笔记

    一、三个简单的问题

    1.给定一串长为2n的01序列,其中0和1的数量相等,满足任意前缀中0的个数不少于1的个数,求序列的个数
    2.给出一串长为n的序列,按顺序将他们进栈,随意出栈,求最后进出栈的方案
    3.给定一个n个节点的二叉树,求二叉树有多少种(这里定义不同指树的形态不同)

    这三个问题都有关catalan数
    事实上关于Catalan的性质有关问题很多,这里只是比较针对的列出了几种。

    二、求解问题1

    稍微想一想及可以知道,问题1,2同构,问题3却好像不一样。

    我们以问题1为例,推出卡特兰数的计算式。

    很简单的容斥原理,我们先求出所有的序列,然后减去不合法的序列即是答案

    所有序列个数直接根据组合数的定义为(C_{2n}^n)

    关于不合法的序列,我们先介绍结论,然后进行证明

    满足存在一个前缀使得1的个数大于0的个数的 n个0与n个1构成的01序列n+1个0与n-1个1构成的01序列 构成一个双射,即11对应关系

    很显然,后者的数量为(C_{2n}^{n-1})

    证明:
    对前者,很显然可以找到一个位置为(2p+1)的前缀,使得其中有(p+1)(1)(p)(0),好的我们把它取反,即得到了后者

    对后者,同样我们可以找到一个位置为(2p+1)的前缀,使得其中有(p)(1)(p+1)(0)(0)(1)多我们一定可以找到),然后取反,得到前者

    综上所述,我们得到了卡特兰数的计算公式1

    [Cat_n=C_{2n}^n-C_{2n}^{n-1} ]

    化简搞一搞

    [Cat_n=frac{C_{2n}^n}{n+1} ]

    可以继续推出递推式

    [Cat_n=frac{2(2n-1)}{n+1}Cat_{n-1} ]

    对递推式(Cat_0=1)

    事实上,计算时求有组合数的那个用的比较多。

    三、求解问题3

    很抱歉有一步的证明不能给出,一是网上没找到,二是听说比较难

    对于问题3,我们发现它本身介绍一个可以递归求解的子问题,设方案数为(h(n))

    我们随便选取一点作为根(点都是相同的),则分别讨论左右子树的大小即可

    显然有

    [h(n)=sum_{i=0}^n h(i) imes h(n-1-i) ]

    [h(0)=h(1)=1 ]

    经过证明,(h(n)=Cat_n)

    于是对于递推式是这样的题目,我们也可以使用卡特兰数解决。

    可能会更新一些题目...

    参考资料:算法竞赛进阶指南,网上的博客

  • 相关阅读:
    一个数组找出第k大的数(待补)
    变动二叉树
    判断一个二叉树
    Redis的过期策略和内存淘汰机制
    sql连接详解
    http 请求和格式
    java基础知识
    分页信息
    持续集成之Jenkins自动部署war包到远程服务器
    no-sql数据库之redis
  • 原文地址:https://www.cnblogs.com/butterflydew/p/9447242.html
Copyright © 2011-2022 走看看