zoukankan      html  css  js  c++  java
  • 卡特兰数的证明以及应用

    出栈序列计数问题

    给定一长为n的序列,各位元素各不相同,那么经过入栈,出栈后,可以得到多少种不同的序列。

    这个问题的答案是卡特兰数C(n)

    卡特兰数

    卡塔兰数是中一个常在各种计数问题中出现的数列。用C(n)表示卡特兰数第n项,则有通项公式

    [C(n)=C_{2n}^n-C_{2n}^{n+1}=frac{C_{2n}^n}{n+1}=frac{(2n)!}{(n+1)!n!} ]

    有递推公式

    [C(0)=1 qquad andqquad C(n+1)=frac{2(2n+1)}{n+2}C(n) ]

    证明

    长为n的序列,每个元素需要入栈一次,出栈一次,以0表示入栈,1表示出栈。则出入栈操作可以由一个长为2n01串唯一表示。这个01串需符合以下条件:

    1. 其中01的数量均为n

    2. 对于任意位置i[1,i]位置的子串中,出现的1的个数不大于0的个数(栈的性质,未入栈不可出栈)。

    可以用容斥原理统计符合条件的01串。

    首先易得符合条件1的01串个数为C(2n,n)

    其中不符合条件2的串一定有: 对于某个位置2i+1[1,2i+1]出现的1的个数为i+10的个数为i

    又此串符合条件1,那么剩余位置的0,1个数分别为n-i,n-i-1

    如果将剩余位置的1变为00变为1。那么这个串就变成了一个由n-10n+11组成的串。

    设符合条件1但不符合条件2的串构成集合N,由n-10n+11组成的01串构成集合M

    由于01互换操作是一个一一映射函数,故MN之间存在一个一一映射,故M,N元素个数相等(映射的性质)。

    故卡特兰数的通项公式为C(2n,n)-C(2n,n+1)

    这种思想称为映射计数法。

    一些可以用卡特兰数的问题

    1. (0,0)(n,n)的不越过直线y=x的非降路径数

    2. n个节点的不同构的二叉树的数量

    3. n+2边形分割为n个三角形的方法数

    4. n对括号排列组成的合法的括号序列个数

  • 相关阅读:
    Springboot 基于的SAP项目环境配置
    Impala 技术点梳理
    Elasticsearch 使用技巧笔记
    ELK 6.x 部署
    eclipse安装lombok
    IIS服务器管理学习
    Springboot依赖注入笔记
    Eclipse解决乱码问题
    Springboot依赖注入 Service类中使用静态变量
    javascript 操作符类型隐性转换
  • 原文地址:https://www.cnblogs.com/cryingrain/p/15426865.html
Copyright © 2011-2022 走看看