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

  • 相关阅读:
    javascript 数组Array对象
    使div浮动层显示在Select组件上面
    CSS中expression使用简介
    Error: Error #2176: 某些动作(如显示弹出窗口的动作)只能通过用户交互来调用
    用.Net处理xmlHttp发送异步请求
    使用反射动态创建对象及调用对象方法
    Asp.net实现在线截图(大图截取为小图)
    一个webproxy代理类
    Asp.net如何截屏
    用 ASP.NET 做网站截图(代码示例)
  • 原文地址:https://www.cnblogs.com/cryingrain/p/15426865.html
Copyright © 2011-2022 走看看