「数学」卡特兰数

洛谷P1044 [NOIP2003 普及组] 栈

定义

经典问题:出栈序列数

由栈性质可得,某一时刻总操作的入栈数不能少于出栈数,若将入栈视为(+1),出栈视为(-1),则任意时刻该序列前缀和不能小于零,且(+1)(-1)总数相等(均为(n)

如何求序列方案数

公式

易得,不剔除非法序列的情况下,序列总方案数为(dbinom{2n}{n})

对于任意非法序列,例如:

[+1,-1,-1,+1,+1,-1 ]

若找到最先处于非法状态的位置(前缀和小于零的位置),将该位置(例子中的第三个)以及之前的数字全部反转,则会得到一个由(n+1)(+1)(n-1)(-1)构成的序列

[-1,+1,+1,+1,+1,-1 ]

反转后的序列在第一个前缀和大于零的位置反转可得到反转前的序列,所以每个非法序列和(n+1)(+1)(n-1)(-1)构成的序列一一对应

由此得到合法序列数

[Cat_n=dbinom{2n}{n}-dbinom{2n}{n-1}=frac{dbinom{2n}{n}}{n+1} ]

可以推出递推式

[Cat_1=1,Cat_n=frac{dbinom{2n}{n}}{n+1}=frac{dbinom{2n-2}{n-1}*frac{2n*(2n-1)}{n*n}}{n+1}=frac{dbinom{2n-2}{n-1}}{n}*frac{2n*(2n-1)}{n*(n+1)}=Cat_{n-1}*frac{4n-2}{n+1} ]

还可以拆开

[Cat_n=frac{prod(4*i-2)}{(n+1)!} ]

另一种形式:

[Cat_n=sum_{i=1}^{n}Cat_{i-1}*Cat_{n-i} ]

若枚举最后一个出栈点的编号(i),那么在(i)入栈之前,前(i-1)个数字必定已经出栈,方案数为(Cat_{i-1}),在(i)出栈前,后(n-i)个数字也已经出栈,方案为(Cat_{n-i})

由于没有除法,写高精方便,且遇到该形式的递推式可以归纳到卡特兰数

用法

输入(3)输出(5)即为卡特兰数

待更

拓展

(n)(+1)(m)(-1,(n≥m)),求任意前缀和不小于零的方案数

易证

[ans=dbinom{n+m}{m}-dbinom{n+m}{n+1} ]

原文地址:https://www.cnblogs.com/knife-rose/p/15010274.html