• Catalan Number-卡特兰数入门


    卡特兰数

    首先,我们设f(n)=序列个数为n的出栈序列种数。同时,我们假定,从开始到栈第一次出到空为止,这段过程中第一个出栈的序数是k。特别地,如果栈直到整个过程结束时才空,则k=n。
    令h(0)=1,h(1)=1,Catalan数满足递归式:h(n) = h(0)h(n-1) + h(1)h(n-2) + ... + h(n-1)*h(0) (n>=2)
    该递推关系的解为:h(n) = C(2n,n)/(n+1),n=0,1,2,3,... (其中C(2n,n)表示2n个物品中取n个的组合数)

    问题描述

    盛况空前的足球赛即将举行。球赛门票售票处排起了球迷购票长龙。

    按售票处规定,每位购票者限购一张门票,且每张票售价为50元。在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值100元的钱币。假设售票处在开始售票时没有零钱。试问这2N个球迷有多少种排队方式可使售票处不致出现找不出钱的尴尬局面。
    例如当n=2是,用A表示手持50元面值的球迷,用B表示手持100元钱的球迷。则最多可以得到以下两组不同的排队方式,使售票员不至于找不出钱。
    第一种:A A B B
    第二种:A B A B

    问题解决

    这一类的问题有很多,但最终都脱离不了一个问题:
    栈的进出先后顺序
    很明显,在栈里,是只有先进了才能出,类似于..左右括号匹配问题(?)
    虽然暴搜是可以解决数据范围比较小的问题,但是如果数据大了就需要一些公式...

    公式

    公式一
    递归公式
    h(0)=h(1)=1
    h(n)= h(0)h(n-1)+h(1)h(n-2) + … + h(n-1)*h(0) (n>=2)
    如果我们用这个公式显然我们要使用递归算法,那么数据一大就在时空上很麻烦

    公式二
    递推公式
    h(n)=h(n-1)(4n-2)/(n+1)
    这个公式应用递推,看上起十分和善
    但对大数据呢?
    我们注意到大数据的时候h(n)会很大,这时候题目一般会让你对某素数取模(当然你可以打高精度(划掉))
    但你在取模过程中难保一个h(n)%mod=0
    那么根据公式下面所有的数都会等于0.

    公式三
    组合数公式1
    h(n)=C(2n,n)/(n+1) (n=0,1,2,…)
    卡特兰数可以与组合数联系起来,得到上面的公式
    而组合数就是一个杨辉三角,可以递推得到(这个不属于这道题的讨论范围我假装你们都会(逃))
    但我们发现对于大数据你要取模,而对于除法你是没办法用膜的性质的(当然你可以应用逆元(划掉)),所以造成了麻烦

    公式四
    组合数公式2
    h(n)=c(2n,n)-c(2n,n-1) (n=0,1,2,…)
    与组合数公式1不同这个是两个组合数的减法
    减法是可以用膜的性质的.

    ov.

    个人博客地址: www.moyujiang.com 或 moyujiang.top
  • 相关阅读:
    堆和栈的区别
    .net中类(class)与结构(struct)的不同
    CTS、CLS、CLR
    C#和.Net的关系
    装箱(boxing)和拆箱(unboxing)
    三层架构
    属性和public字段的区别(调用set方法为一个属性设值,然后用get方法读取出来的值一定是set进去的值吗?)
    override与重载(overload)的区别
    C#中的委托是什么?事件是不是一种委托?事件和委托的关系。
    json转树状菜单栏
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11232459.html
Copyright © 2020-2023  润新知