卡特兰数

卡特兰数

卡特兰数基本例题:

T1:合法括号序列方案数:

问题:长度为 2n 的括号序列,n 个左括号,n 个右括号,求合法括号序列方案数。

问题转换,也就是任何时刻 右括号数<=左括号数。

我们要求长度为2n的括号序列,考虑把一个括号序列断开成两个,左括号个数分别为i和n-i,枚举断点。

第一眼 dpdp[i] 表示有 i 个左括号的合法的括号序列,根据乘法原理 dp 方程如下:

示意:枚举和第一个左括号(第一个位置)与对应的右括号之间有多少括号对

dpm=i=1mdpi1dpmi

这是O(n2)的做法,如何更加优秀呢?

我们将dp数列写出来

特别的根据定义,dp0=1,dp1=1

<dp0=1,dp1=1,dp2,......,dpn1,dpn>

我们再将每一个dp是怎么来的写出来

dp0=1

dp1=1

dp2=dp1dp1

dp3=dp1dp2+dp2dp1

dp4=dp1dp3+dp2dp2+dp3dp1

dp5=

这个数列我们可以容易的看出是这个数列本身和自己卷积在向右移动1位再在首位+1得到

因为这个数列和自己卷积得到

<dp0dp1+dp1dp0,dp0dp2+dp1dp1+dp2dp0,dp0dp3+dp1dp2+dp2dp1dp3dp0>

发现就是向右移动1位再在首位+1得到

那么我们设序列生成函数为 G(x)

G(x)2x+1=G(x)

解二元一次方程可得:

G(x)=1±(14x)2x

我们需要泰勒展开(14x)

我们先求导

f(x)=(14x)

f(x)=12(14x)12×4

f(2)(x)=(12)(12)(14x)32×(4)2

f(3)(x)=(12)(12)(32)(14x)52(4)3

f(n)(x)=(1)n1×2n×(1×3×5××2n3)(14x)2n12×(4)n

带入泰勒展开,在x0=0 的位置展开

f(x)=1+n=1(1)n1×(1×3×5××2n3)n!×2n×(4x)n

带回G(x)得

G(x)=11n=1(1)n1×(1×3×5××2n3)n!×2n×(4x)n2x

G(x)=12×n=1(1×3×5××2n3)n!×2n×(4x)n1

分式里面上下同乘2×4××2n2

G(x)=12×n=1(2n2)!n!×2n×(n1)!×2n1×(4x)n1

G(x)=12×n=14n2n2n1×(2n2)!n!×(n1)!×(x)n1

G(x)=n=11n×(2n2)!(n1)!×(n1)!×xn1

G(x)=n=01n+1×2n!n!×n!×xn

我们找生成函数的第i项系数

[xn]G(x)=1n+1×2n!n!+n!=(2nn)n+1

得证

我们根据推出的这个可以推出另外一个线性求卡特兰数

dp[i]=dp[i1]×4×n2i+1

卡特兰数还有这个表示方法

(2nn)(2nn1)

证明

我们构造这样一种模型

问题:你可以向上走和向右走各走n个单位,最后要到达 (n,n) 途中不能越过y=x,求方案数量。

容斥原理,用总方案减不合法的方案

总方案:(2nn)

考虑一共 2n 单位,其中 n 是向上

不合法方案:(2nn+1)

考虑

这是不合法方案,刚刚超过一格的一格一定是向上的,不算入组合方案,剩下的向上的,所以方案数是:(2nn1)

所以是

(2nn)(2nn1)

posted @   He_Zi  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示