一篇优秀的卡特兰数详解,里面有些具体模型和推导是我这篇博客所没有的
最最最经典的例题运用:设栈S初始状态为空,有五个序列一次入栈,出栈序列有(42)种。
C a t a l a n Catalan Catalan = C 2 n n n + 1 \frac{\textrm{C}_{2n}^{n}}{n+1} n+1C2nn
卡特兰数:
通项公式: C n \textrm{C}_{n} Cn = = = 1 n + 1 \frac{1}{n+1} n+11 ( 2 n n ) \binom{2n}{n} (n2n) = = = ( 2 n ) ! ( n + 1 ) ! n ! \frac{(2n)!}{(n+1)!n!} (n+1)!n!(2n)!
递推公式: C n \textrm{C}_{n} Cn = C 0 \textrm{C}_{0} C0 * C n − 1 \textrm{C}_{n-1} Cn−1+ C 1 \textrm{C}_{1} C1 * C n − 2 \textrm{C}_{n-2} Cn−2+ …… + C n − 1 \textrm{C}_{n-1} Cn−1 * C 0 \textrm{C}_{0} C0
用一个应用证明通项公式:
题目:
一个栈(无穷大)的进栈序列为
1
,
2
,
3
,
…
,
n
1,2,3,…,n
1,2,3,…,n,有多少个不同的出栈序列?
证明:
对于每一个数来说,必须进栈一次、出栈一次。
我们把进栈设为状态
‘
1
’
‘1’
‘1’,出栈设为状态
‘
0
’
‘0’
‘0’。
n
n
n 个数的所有状态对应
n
n
n 个
1
1
1 和
n
n
n 个
0
0
0 组成的
2
n
2n
2n 位二进制数
且
1
1
1 的累计数不小于
0
0
0 的累计数的方案数。
在
2
n
2n
2n 位二进制数中填入
n
n
n 个
1
1
1 的方案数为
C
2
n
n
\textrm{C}_{2n}^{n}
C2nn
从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。
不符合要求的数的特征是由左而右扫描时,
必然在某一奇数位
2
m
+
1
2m+1
2m+1 位上首先出现
m
+
1
m+1
m+1 个
0
0
0 的累计数和
m
m
m 个
1
1
1 的累计数
此后的
2
(
n
−
m
)
−
1
2(n-m)-1
2(n−m)−1 位上有
n
−
m
n-m
n−m 个
1
1
1 和
n
−
m
−
1
n-m-1
n−m−1 个
0
0
0。
如若把后面这
2
(
n
−
m
)
−
1
2(n-m)-1
2(n−m)−1 位上的
0
0
0 和
1
1
1 互换,使之成为
n
−
m
n-m
n−m 个
0
0
0 和
n
−
m
−
1
n-m-1
n−m−1 个
1
1
1,
结果得由
n
+
1
n+1
n+1 个
0
0
0 和
n
−
1
n-1
n−1 个
1
1
1 组成的
2
n
2n
2n 位数
即一个不合要求的数对应于一个由
n
+
1
n+1
n+1 个
0
0
0 和
n
−
1
n-1
n−1 个
1
1
1 组成的排列。
反过来,任何一个由
n
+
1
n+1
n+1 个
0
0
0 和
n
−
1
n-1
n−1 个
1
1
1 组成的
2
n
2n
2n 位二进制数
由于
0
0
0 的个数多
2
2
2 个,
2
n
2n
2n 为偶数,故必在某一个奇数位上出现
0
0
0 的累计数超过
1
1
1 的累计数。
同样在后面部分
0
0
0 和
1
1
1 互换,使之成为由
n
n
n 个
0
0
0 和
n
n
n 个
1
1
1 组成的
2
n
2n
2n 位数,
即
n
+
1
n+1
n+1 个
0
0
0 和
n
−
1
n-1
n−1 个
1
1
1 组成的
2
n
2n
2n 位数必对应一个不符合要求的数。
因而不合要求的
2
n
2n
2n 位数与
n
+
1
n+1
n+1 个
0
0
0,
n
-
1
n-1
n-1 个
1
1
1 组成的排列一一对应。
显然,不符合要求的方案数为 C 2 n n − 1 \textrm{C}_{2n}^{n-1} C2nn−1。
由此得出输出序列的总数目=
C
2
n
n
\textrm{C}_{2n}^{n}
C2nn-
C
2
n
n
−
1
\textrm{C}_{2n}^{n-1}
C2nn−1=
C
2
n
n
n
+
1
\frac{\textrm{C}_{2n}^{n}} {n+1}
n+1C2nn。
应用:
括号化
题目:
矩阵链乘:
P
=
a
1
×
a
2
×
a
3
×
…
…
×
a
n
P=a1×a2×a3×……×an
P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
出栈次序
一个栈(无穷大)的进栈序列为 1 , 2 , 3 , … , n 1,2,3,…,n 1,2,3,…,n,有多少个不同的出栈序列?
<分析>
设
f
(
n
)
f(n)
f(n)为序列个数为
n
n
n 的出栈序列种数。
假定最后出栈的元素为
k
k
k,在
k
k
k入栈之前,比
k
k
k小的值均出栈,此处情况有
f
(
k
−
1
)
f(k-1)
f(k−1)种
而之后比
k
k
k大的值入栈,且都在
k
k
k之前出栈,因此有
f
(
n
−
k
)
f(n-k)
f(n−k)种方式
所以
f
(
k
)
=
f
(
n
−
k
)
∗
f
(
k
−
1
)
f(k) = f(n-k)*f(k-1)
f(k)=f(n−k)∗f(k−1),而k可以选1到n
所以
f
(
n
)
=
f
(
0
)
f
(
n
−
1
)
+
f
(
1
)
f
(
n
−
2
)
+
…
…
+
f
(
n
−
1
)
f
(
0
)
f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)
f(n)=f(0)f(n−1)+f(1)f(n−2)+……+f(n−1)f(0)
买票找零
有
2
n
2n
2n个人排成一行进入剧场。入场费5元。其中n人有5元钞票,n人有10元钞票,剧院无其它钞票,问有多少种方法使得只要有10元的人买票,售票处就有5元的钞票找零?
<分析>
将5元视作入栈,10元视作出栈
凸多边形三角划分
在凸n边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形,求不同划分的方案数
f
(
n
)
f(n)
f(n)。
<分析>
以某一条边为基准,以这条边的两个顶点为起点
P
1
P1
P1和终点
P
P
Pn
将该凸多边形的顶点依序标记为
P
1
、
P
2
、
…
…
、
P
n
P1、P2、……、Pn
P1、P2、……、Pn
再在该凸多边形中找任意一个不属于这两个点的顶点
P
k
Pk
Pk,来构成一个三角形
用这个三角形把一个凸多边形划分成两个凸多边形
其中一个凸多边形,是由
P
1
,
P
2
,
…
…
,
P
k
P1,P2,……,Pk
P1,P2,……,Pk构成的凸k边形
另一个凸多边形,是由
P
k
,
P
k
+
1
,
…
…
,
P
n
Pk,Pk+1,……,Pn
Pk,Pk+1,……,Pn构成的凸n-k+1边形。
把Pk视为确定一点,
f
(
n
)
=
f
(
k
)
∗
f
(
n
−
k
+
1
)
f(n)=f(k)*f(n-k+1)
f(n)=f(k)∗f(n−k+1),而k可以选2到n-1,所以总方案数为:
f
(
n
)
=
f
(
2
)
f
(
n
−
2
+
1
)
+
f
(
3
)
f
(
n
−
3
+
1
)
+
…
…
+
f
(
n
−
1
)
f
(
2
)
f(n)=f(2)f(n-2+1)+f(3)f(n-3+1)+……+f(n-1)f(2)
f(n)=f(2)f(n−2+1)+f(3)f(n−3+1)+……+f(n−1)f(2)
方格地图
n
∗
n
n*n
n∗n的方格地图,从一个角到对角线的另一个角,不跨越对角线的路径数。
<分析>
若从左下角到右上角,相当于往上
n
n
n,往右
n
n
n,且往上的次数不能超过往右的,与上面买票同解。
圆上划线
在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
n对括号正确匹配数目
给定n对括号,求括号正确配对的字符串数
例如:
0对括号:[空序列] 1种可能
1对括号:() 1种可能
2对括号:()() (()) 2种可能
3对括号:((())) ()(()) ()()() (())() (()()) 5种可能
<分析>
考虑
n
n
n 对括号时的任意一种配对方案
最后一个右括号有唯一的与之匹配的左括号,于是有唯一的表示A(B),其中A和B也是合法的括号匹配序列
假设
S
(
n
)
S(n)
S(n)为
n
n
n对括号的正确配对数目,
那么有递推关系
S
(
n
)
=
S
(
0
)
S
(
n
−
1
)
+
S
(
1
)
S
(
n
−
2
)
+
.
.
.
+
S
(
n
−
1
)
S
(
0
)
S(n)=S(0)S(n-1)+S(1)S(n-2) +...+S(n-1)S(0)
S(n)=S(0)S(n−1)+S(1)S(n−2)+...+S(n−1)S(0)
二叉树
n
n
n 个不同点可以构造多少棵不同的二叉树