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对括号排列组成的合法的括号序列个数

  • 相关阅读:
    Eclipse中创建标准web工程以及标准目录结构说明
    log4j配置说明
    常用的Eclilpse插件列表以及安装方式总结
    Eclipse插件安装总结
    eclipse中加放js文件报js语法错误解决办法
    如何在Eclipse中配置Tomcat服务器
    webpack的单vue组件(.vue)加载sass配置
    总结自己常用的几种居中方式
    两个正则坑
    CSS拾遗(二)
  • 原文地址:https://www.cnblogs.com/cryingrain/p/15426865.html
Copyright © 2011-2022 走看看