一.Catalan数.
Catalan数:卡特兰数 C n C_n Cn表示 n n n个 0 0 0和 n n n个 1 1 1可以组成的不同序列的数量,其中这种序列必须满足每一个前缀中 1 1 1数量必须不少于 0 0 0的数量.
Catalan数的通项公式:
C
n
=
1
n
+
1
(
2
n
n
)
C_n=\frac{1}{n+1}\binom{2n}{n}
Cn=n+11(n2n)
证明:
我们把所有这样的
n
n
n个
1
1
1和
0
0
0组成的不同序列全部列出来,这些数列的数量为
(
2
n
n
)
\binom{2n}{n}
(n2n).
把所有破坏这种性质的序列都取出来,发现把它们第一个破坏性质的位置后的所有
01
01
01取反,然后我们可以得到一个
n
−
1
n-1
n−1个
1
1
1和
n
+
1
n+1
n+1个
0
0
0组成的序列.
同理这样的由
n
−
1
n-1
n−1个
0
0
0和
n
+
1
n+1
n+1个
1
1
1组成的序列也对应一个破坏性质的序列.
很容易发现这两种序列是一一对应关系,而
n
−
1
n-1
n−1个
1
1
1和
n
+
1
n+1
n+1个
0
0
0组成的不同序列数量为
(
2
n
n
−
1
)
\binom{2n}{n-1}
(n−12n)种.最后推导一下:
C
n
=
(
2
n
n
)
−
(
2
n
n
−
1
)
=
(
2
n
)
!
n
!
n
!
−
(
2
n
)
!
(
n
−
1
)
!
(
n
+
1
)
!
=
(
n
+
1
)
(
2
n
)
!
−
n
(
2
n
)
!
(
n
+
1
)
n
!
n
!
=
1
n
+
1
(
2
n
n
)
C_n=\binom{2n}{n}-\binom{2n}{n-1}=\frac{(2n)!}{n!n!}-\frac{(2n)!}{(n-1)!(n+1)!}=\frac{(n+1)(2n)!-n(2n)!}{(n+1)n!n!}=\frac{1}{n+1}\binom{2n}{n}
Cn=(n2n)−(n−12n)=n!n!(2n)!−(n−1)!(n+1)!(2n)!=(n+1)n!n!(n+1)(2n)!−n(2n)!=n+11(n2n)
证毕.
进出栈序列统计:有一个栈和 n n n个互不相同元素,现在要求不改变它们的顺序让它们进栈与出栈,问出栈序列的方案数.
分析:将进栈看为
1
1
1,出栈看为
0
0
0,就与Catalan数的组合意义相同了,方案数即为
C
n
C_n
Cn.
二.格路径数统计.
格路径计数:给定一张 n ∗ n n*n n∗n的网格,每次走只能向右或者向上走一步,求从 ( 0 , 0 ) (0,0) (0,0)走到 ( n , n ) (n,n) (n,n)不越过对角线 y = x y=x y=x,求方案数.
分析:将棋盘按照对角线分为两部分,两部分的方案一一对应,现在只考虑其中的右下部分.
现在把向右走看为向量 ( 1 , 0 ) (1,0) (1,0),向上走看为向量 ( 0 , 1 ) (0,1) (0,1),那么显然两个向量 ( 1 , 0 ) (1,0) (1,0)和 ( 0 , 1 ) (0,1) (0,1)分别对应Catalan数组合意义中的 1 1 1和 0 0 0,方案数就为 C n C_{n} Cn,乘 2 2 2后得到答案 2 C n 2C_{n} 2Cn.
格路径计数拓展1:不越过的对角线变为直线 y = x + m y=x+m y=x+m,,求方案数.
与上面Calatan数的通项公式类似的,答案为:
(
2
n
n
)
−
(
2
n
n
−
m
−
1
)
\binom{2n}{n}-\binom{2n}{n-m-1}
(n2n)−(n−m−12n)
格路径计数拓展2:由 n ∗ n n*n n∗n的网格变为 n ∗ m ( n < m ) n*m(n<m) n∗m(n<m)的网格,求方案数.
分析:转化为一张网格上通过向量 ( 1 , 1 ) (1,1) (1,1)和 ( 1 , − 1 ) (1,-1) (1,−1)从 ( 0 , 0 ) (0,0) (0,0)走到 ( n + m , n − m ) (n+m,n-m) (n+m,n−m)不接触直线 y = − 1 y=-1 y=−1的方案数.
通过补集转化,答案变成总方案数减去经过 y = − 1 y=-1 y=−1的方案数,显然的总方案数为 ( n + m m ) \binom{n+m}{m} (mn+m).
再把原点 ( 0 , 0 ) (0,0) (0,0)到第一次接触 y = − 1 y=-1 y=−1的那一段沿 y = − 1 y=-1 y=−1对称,方案一一对应,且此时向量 ( 1 , 1 ) (1,1) (1,1)多了一个,向量 ( 1 , − 1 ) (1,-1) (1,−1)少了一个,所以方案数为 ( n + m m − 1 ) \binom{n+m}{m-1} (m−1n+m).
于是答案就为:
(
n
+
m
m
)
−
(
n
+
m
m
−
1
)
\binom{n+m}{m}-\binom{n+m}{m-1}
(mn+m)−(m−1n+m)
三.Catalan数的一阶递推式.
根据Catalan数的通项公式,我们可以推导:
C
n
C
n
−
1
=
1
n
+
1
(
2
n
n
)
1
n
(
2
n
−
2
n
−
1
)
=
(
2
n
)
!
(
n
+
1
)
!
n
!
(
2
n
−
2
)
!
n
!
(
n
−
1
)
!
=
(
2
n
)
!
n
!
(
n
−
1
)
!
(
2
n
−
2
)
!
(
n
+
1
)
!
n
!
=
2
n
(
2
n
−
1
)
n
(
n
+
1
)
=
4
n
2
−
2
n
n
2
+
n
=
4
n
−
2
n
+
1
\frac{C_n}{C_{n-1}}=\frac{\frac{1}{n+1}\binom{2n}{n}}{\frac{1}{n}\binom{2n-2}{n-1}}\\ =\frac{\frac{(2n)!}{(n+1)!n!}}{\frac{(2n-2)!}{n!(n-1)!}}\\ =\frac{(2n)!n!(n-1)!}{(2n-2)!(n+1)!n!}\\ =\frac{2n(2n-1)}{n(n+1)}\\ =\frac{4n^2-2n }{n^2+n}\\ =\frac{4n-2}{n+1}
Cn−1Cn=n1(n−12n−2)n+11(n2n)=n!(n−1)!(2n−2)!(n+1)!n!(2n)!=(2n−2)!(n+1)!n!(2n)!n!(n−1)!=n(n+1)2n(2n−1)=n2+n4n2−2n=n+14n−2
那么我们就有了Catalan数的递推式1:
C
n
=
(
4
n
−
2
)
C
n
−
1
n
+
1
C_{n}=\frac{(4n-2)C_{n-1}}{n+1}
Cn=n+1(4n−2)Cn−1
初始条件为
C
0
=
1
C_0=1
C0=1.
四.拟Catalan数.
拟Catalan数:定义拟Catalan数 C n ∗ = n ! C n − 1 C_{n}^{*}=n!C_{n-1} Cn∗=n!Cn−1.
我们可以通过Catalan数的递推公式来推出拟Catalan数的递推公式:
C
n
∗
=
n
!
C
n
−
1
=
n
!
∗
4
n
−
6
n
∗
C
n
−
2
=
(
4
n
−
6
)
C
n
−
1
∗
C_{n}^{*}=n!C_{n-1}=n!*\frac{4n-6}{n}*C_{n-2}=(4n-6)C_{n-1}^{*}
Cn∗=n!Cn−1=n!∗n4n−6∗Cn−2=(4n−6)Cn−1∗
初始条件
C
0
∗
=
1
C_{0}^{*}=1
C0∗=1.
五.序列合并方案统计与Catalan数的另一个递推式.
序列合并方案统计1:对于一个长度为 n n n的序列 a i a_i ai,每次可以把两个数相乘,求将序列相乘成一个数的方案数.
分析:考虑递推,设长度为 n n n的序列方案数为 f n f_n fn,显然初态 f 0 = 1 f_0=1 f0=1.
对于
f
n
−
1
f_{n-1}
fn−1包含的每一种方案,我们考虑如何插入
a
n
a_n
an.对于其中一个乘式
(
a
∗
b
)
(a*b)
(a∗b),把
a
n
a_n
an插入进去会有以下
4
4
4种情况:
(
(
a
n
∗
a
)
∗
b
)
(
(
a
∗
a
n
)
∗
b
)
(
a
∗
(
a
n
∗
b
)
)
(
a
∗
(
b
∗
a
n
)
)
((a_n*a)*b)\\ ((a*a_n)*b)\\ (a*(a_n*b))\\ (a*(b*a_n))
((an∗a)∗b)((a∗an)∗b)(a∗(an∗b))(a∗(b∗an))
总共有 n − 2 n-2 n−2个乘式,所以有 4 ( n − 2 ) f n − 1 4(n-2)f_{n-1} 4(n−2)fn−1的贡献.
另外,对于整一个式子,还有
2
2
2种情况:
a
n
∗
a
a
∗
a
n
a_n*a\\ a*a_n
an∗aa∗an
所以可以得到
f
n
f_n
fn的递推式:
f
n
=
[
4
(
n
−
2
)
+
2
]
f
n
−
1
=
(
4
n
−
6
)
f
n
−
1
f_n=[4(n-2)+2]f_{n-1}=(4n-6)f_{n-1}
fn=[4(n−2)+2]fn−1=(4n−6)fn−1
我们发现这个数列的初态和递推公式均与拟Catalan数相同,所以这个问题的方案数就是 C n ∗ C_{n}^{*} Cn∗.
序列合并方案统计2:对于一个长度为 n n n的序列 a i a_i ai,每次可以把相邻两个数相乘,求将序列相乘成一个数的方案数.
分析:显然对于统计问题1,总会有 n ! n! n!方案对应着统计问题2中的同一种方案,那么答案就是 C n ∗ n ! = C n − 1 \frac{C_{n}^{*}}{n!}=C_{n-1} n!Cn∗=Cn−1.
换一种分析方法:我们重新考虑
f
n
f_n
fn的一个更加暴力的转移:
f
n
=
∑
i
=
1
n
−
1
f
i
f
n
−
i
f_{n}=\sum_{i=1}^{n-1}f_{i}f_{n-i}
fn=i=1∑n−1fifn−i
而
f
n
=
C
n
−
1
f_n=C_{n-1}
fn=Cn−1,所以有:
C
n
−
1
=
∑
i
=
1
n
−
1
C
i
−
1
C
n
−
1
−
i
=
∑
i
=
0
n
−
2
C
i
C
n
−
2
−
i
C_{n-1}=\sum_{i=1}^{n-1}C_{i-1}C_{n-1-i}\\ =\sum_{i=0}^{n-2}C_{i}C_{n-2-i}
Cn−1=i=1∑n−1Ci−1Cn−1−i=i=0∑n−2CiCn−2−i
即:
C
n
=
∑
i
=
0
n
−
1
C
i
C
n
−
1
−
i
C_{n}=\sum_{i=0}^{n-1}C_{i}C_{n-1-i}
Cn=i=0∑n−1CiCn−1−i
这就是Catalan数的递推公式2.
六.BST方案统计与凸多边形三角划分.
BST方案统计:给定 n n n个点权,问对应BST的形态有多少种.
分析:设
f
n
f_n
fn表示
n
n
n个点组成的BST形态数量,那么我们可以枚举根的左子树大小,得到方程:
f
n
=
∑
i
=
0
n
−
1
f
i
f
n
−
1
−
i
f_n=\sum_{i=0}^{n-1}f_{i}f_{n-1-i}
fn=i=0∑n−1fifn−1−i
发现就是个Catalan数,答案即为 C n C_{n} Cn.
凸多边形三角划分:将一个 n n n个顶点的凸多边形用 n − 3 n-3 n−3条线段划分成 n − 2 n-2 n−2个三角形,求方案数.
分析:设
f
n
f_n
fn表示将
n
+
2
n+2
n+2个顶点组成的凸多边形划分成
n
n
n个三角形的方案数,可以直接转移:
f
n
=
∑
i
=
0
n
−
1
f
i
f
n
−
1
−
i
f_n=\sum_{i=0}^{n-1}f_{i}f_{n-1-i}
fn=i=0∑n−1fifn−1−i
发现还是Catalan数,那么答案就是 C n − 2 C_{n-2} Cn−2.