Catalan数列的几个模型

卡特兰数列

1.卡特兰数列

​ 它是组合数学中一个常出现在各种计数问题中出现的数列,其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, …

2. 问题的引入
例1 二叉树的计数

有一颗二叉树,一共有n个节点,问它有多少种可能?

分析

f ( n ) f(n) f(n)表示答案。分三种情况讨论:只有左子树、只有右子树、左右子树均有。

只有左子树:左子树中有 n − 1 n-1 n1个节点,方案数为 f ( n − 1 ) f(n-1) f(n1)

只有右子树: 右子树中有 n − 1 n-1 n1个节点,方案数为 f ( n − 1 ) f(n-1) f(n1)

左右子树均有:设左子树中有 x x x个节点,则右子树中有 n − x − 1 n-x-1 nx1个节点,方案数为: ∑ x = 1 n − 2 f ( x ) ∗ f ( n − x − 1 ) \sum_{x=1}^{n-2}f(x)*f(n-x-1) x=1n2f(x)f(nx1)

则总的方案数为 f ( n ) = ∑ x = 1 n − 2 f ( x ) ∗ f ( n − x − 1 ) + f ( n − 1 ) + f ( n − 1 ) = ∑ x = 0 n − 1 f ( x ) ∗ f ( n − x − 1 ) f(n)=\sum_{x=1}^{n-2}f(x)*f(n-x-1)+f(n-1)+f(n-1)=\sum_{x=0}^{n-1}f(x)*f(n-x-1) f(n)=x=1n2f(x)f(nx1)+f(n1)+f(n1)=x=0n1f(x)f(nx1)

$f(0) = 1, f(1) = 1, f(2) = 2, f(3) = 5,f(4) = 14, \dots $

这就是Catalan数列。

3.其他Catalan模型
例2 凸多边形的三角形剖分

给一个n条边的凸多边形,现在把它剖分成若干个三角形。每个三角形的三个顶点必须是凸多边形的顶点。

问有多少种剖分方案。

f ( n ) f(n) f(n)表示凸多边形的三角形剖分方案,显然 f ( 3 ) = 1 , f ( 4 ) = 2 f(3)=1,f(4)=2 f(3)=1,f(4)=2

先给凸多边形的顶点按照顺时针编号为 1 , 2 , 3 , … , n 1,2,3,\dots,n 1,2,3,,n.

如果用直线来划分,则方案中可能有重复。我们可以用三角形来划分。

取底边为 ( 1 , n ) (1,n) (1,n)作为该三角形的底边,三角形的另一个顶点为 i i i。则三角形 △ ( 1 , n , i ) \triangle(1,n,i) (1,n,i)把凸多边形分成了左右两个部分,左边的顶点为 ( 1 , 2 , … , i ) (1,2,\dots,i) (1,2,,i),右边的顶点为 ( i , i + 1 , i + 2 , … , n ) (i,i+1,i+2,\dots,n) (i,i+1,i+2,,n).

左边的凸多边形为 i i i边形,右边的凸多边形为 n − i + 1 n-i+1 ni+1边形。则方案数为 f ( n ) = ∑ i = 2 n − 1 f ( i ) ∗ f ( n − i + 1 ) f(n) = \sum_{i=2}^{n-1}f(i) * f(n-i+1) f(n)=i=2n1f(i)f(ni+1).

因为 i i i可取到2,设 f ( 2 ) = 1 f(2)=1 f(2)=1, f ( 3 ) = 1 , f ( 4 ) = 2 f(3)=1,f(4)=2 f(3)=1,f(4)=2,这也是一个Catalan数列,只是它是从第二项开始的。

如果我们把 f ( 2 ) f(2) f(2)看做是第0项,则 f ( 0 ) = 1 , f ( 1 ) = 1 , f ( 1 ) = 2 , f ( n ) = ∑ i = 0 n − 1 f ( i ) ∗ f ( n − i − 1 ) f(0)=1,f(1)=1,f(1)=2,f(n)=\sum_{i=0}^{n-1}f(i)*f(n-i-1) f(0)=1,f(1)=1,f(1)=2,f(n)=i=0n1f(i)f(ni1)

则完全是一个标准的Catalan数列了。

例3 出栈问题

有一个栈,n个元素排队进栈,按照进栈的顺序,给他们编号为 1 , 2 , … , n 1,2,\dots,n 1,2,,n,问它们有多少种出栈顺序?

分析

f ( n ) f(n) f(n)表示出栈的所有方案。

枚举最后一个出栈的元素,设其编号为 i i i,则编号比 i i i小的元素,它们比 i i i先进栈,比 i i i先出栈,则它们为一个 f ( i − 1 ) f(i-1) f(i1)的子问题。

而编号大于 i i i的元素,它们比 i i i后进栈,比 i i i先出栈,它们也是一个 f ( n − i ) f(n-i) f(ni)的子问题。

所以 f ( n ) = ∑ i = 1 n f ( i − 1 ) ∗ f ( n − i ) = ∑ i = 0 n − 1 f ( i ) ∗ f ( n − i − 1 ) f(n)=\sum_{i=1}^nf(i-1)*f(n-i)=\sum_{i=0}^{n-1}f(i)*f(n-i-1) f(n)=i=1nf(i1)f(ni)=i=0n1f(i)f(ni1)

例4 排队问题

2 ∗ n 2*n 2n个人排队购票,票价为50元,每人买一张。有n个人只有100元,有n个人只有50元。而售票员没有准备任何零钱。所有人除了买票之外,不能借钱,赊账等,只能现金交易。问有多少种排队的方式,可以使得买票顺利进行。

分析

问题等价于求有多少种排队方案,满足任意前缀中50元的人数不少于100元的人数。

将50元看做进栈操作,将100元看做出栈操作。则 2 ∗ n 2*n 2n个人的一种满足条件的排队方案对应 n n n个元素的一个合法的进栈、出栈序列。设出栈的元素按先后顺序编号为 1 , 2 , 3 , … , n 1,2,3,\dots,n 1,2,3,,n,则一个进栈、出栈的操作序列对应唯一的一个出栈顺序。

则问题转换为例3,求 n n n个元素加的出队方案。

所以有:

f ( n ) = ∑ i = 1 n f ( i − 1 ) ∗ f ( n − i ) = ∑ i = 0 n − 1 f ( i ) ∗ f ( n − i − 1 ) f(n)=\sum_{i=1}^nf(i-1)*f(n-i)=\sum_{i=0}^{n-1}f(i)*f(n-i-1) f(n)=i=1nf(i1)f(ni)=i=0n1f(i)f(ni1)

另一种思路:

设第一次出现100元的人数超过了50元的人数,这个位置为i,则这是一种非法的方案。

将前i个位置的人,全部取反,100元变为50元,50元变为100元,则100元的人数将变为 n − 1 n-1 n1个人,而50元的人数将变为 n + 1 n+1 n+1个人。

你会发现,任一一种非法的方案,都可以这样转换。

更巧妙的是, n + 1 n+1 n+1个50元和 n − 1 n-1 n1个100元的队形,都可以逆转换为一种非法的方案。逆转换的方案是:找到第一次50元超过100元的位置i,将前i个位置全部取反。

所以,非法方案的总数和 n + 1 n+1 n+1个50元与 n − 1 n-1 n1个100元的方案是一一对应的。

所以,合法的方案总数 a n s = C ( 2 ∗ n , n ) − C ( 2 ∗ n , n − 1 ) ans=C(2*n,n)-C(2*n,n-1) ans=C(2n,n)C(2n,n1)

例5 路径问题

有一个 n ∗ n n*n nn的棋盘,从左下角做到右上角,且行动轨迹必须在棋盘的下三角中,即不能跨过对角线,问有多少种走法?

分析

模型转换 → \to “进栈序列”。

从左上角走到右上角一共需要走 2 ∗ n 2*n 2n步。

将向右走看做入栈,将向上走看做出栈,任意时刻,入栈的次数一定不能少于出栈的次数。

每一种合法的走法都对应于一种合法的出栈方案。

$f(0) = 1, f(1)=1,f(2)=2 $

这也是一个catalan数列。

例6 括号问题

2 ∗ n 2*n 2n个括号,其中有n个左括号,n个右括号,问有多少种合法的括号表达式?

分析

问题可以转换为出栈序列。将左括号看做入栈,右括号看做出栈即可

例7 握手问题

在圆桌旁均匀地坐了 2 ∗ n 2*n 2n个人,某一瞬间,每个人都在和另一个人握手,而且所有人握手都没有交叉发生。问有多少种可能的握手方案。

分析

按顺时针方向给 2 ∗ n 2*n 2n个人编号,每一对握手的人,可以看做是一对括号。于是问题就变为了括号问题。

综合以上模型,卡特兰的递推式为:
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) f(n)=i=0n1f(i)f(n1i)
通项公式为:
f ( n ) = C ( 2 n , n ) − C ( 2 n , n − 1 ) = 1 n C ( 2 n , n − 1 ) = 1 n + 1 C ( 2 n , n ) f(n)=C(2n,n)-C(2n, n-1) = \frac{1}{n}C(2n,n-1) = \frac{1}{n+1}C(2n,n) f(n)=C(2n,n)C(2n,n1)=n1C(2n,n1)=n+11C(2n,n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值