卡特兰数

引入

以下问题属于卡特兰数列。

1.\(n\) 对括号,问合法括号匹配的方案数。
2.\(n\) 个元素依此顺序进栈,则有多少种出栈序列。
3.一个 \(n\times n\) 网格图,你要从 \((0,0)\) 走到 \((n,n)\),每次可以上下左右走,不可以走到 \((0,0)\sim (n,n)\) 的对角线下,方案数。
4.等等

​数列的前几项为:\(1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862,...\)

讲解

我们以第一个问题为例。\(n\) 对括号,问合法括号匹配的方案数。
我们知道,合法的括号匹配满足以下条件:把左括号看成 \(1\),后括号看成 \(-1\),使得任意前缀不小于 \(0\)
如果用 dp 来做,我们可以设这样的状态:\(dp_{i,j}\) 表示前 \(i\) 位前缀和为 \(j\) 的方案数,
\(dp_{i,j}=dp_{i-1,j+1}+[j>0]\times dp_{i-1,j-1}\),结果是 \(dp_{2n,0}\).

然而我们这样做的话代价太大,我们考虑用组合来做。
首先总的方案数是 \(C(2n,n)\),我们要考虑不合法的方案数。
假设这里有一个不合法的方案 \(A\),若我们将其第一个前缀和为 \(-1\) 的前缀全部取反,成为序列 \(B\).
那么我们会得到一个 \(n-1\)\(-1\)\(n+1\)\(1\) 的序列,
因为前缀和为 \(-1\),必须满足 \(-1\) 个数比 \(1\) 的个数多 \(1\)。取反的话 \(-1\) 少了一个,\(1\) 多了一个。
比如 \(A=\{1,-1,1,-1,-1,1\}\),那么 \(B=\{-1,1,-1,1,1,1\}\).
因为 \(A\) 的第一个前缀和为 \(-1\) 的前缀是 \(1\sim 5\).

注意到 \(A\)\(B\) 是有一一对应关系的,
那么 \(A\) 的方案数等于 \(B\) 的方案数为 \(C(2n,n+1)\).
故总方案数减去 \(A\) 的方案数就是答案 \(C(2n,n)-C(2n,n+1)\)
所以卡特兰数的通项就是 \(C(2n,n)-C(2n,n+1)\)

posted @ 2023-09-06 19:59  s1monG  阅读(18)  评论(0)    收藏  举报