卡特兰数(Catalan number)

卡特兰数

定义

C n = ( 2 n n ) n + 1 = ( 2 n ) ! ( n + 1 ) ! n ! = ∏ k = 2 n n + k k = ∑ i = 0 n − 1 C i C n − i = 2 ( 2 n − 1 ) n + 1 C n − 1 = ( 2 n n ) − ( 2 n n − 1 ) C_n=\frac{\begin{pmatrix}2n\\n\end{pmatrix}}{n+1}=\frac{(2n)!}{(n+1)!n!}=\prod_{k=2}^{n}\frac{n+k}{k}=\sum_{i=0}^{n-1}C_iC_{n-i}=\frac{2(2n-1)}{n+1}C_{n-1}=\begin{pmatrix}2n\\n\end{pmatrix}-\begin{pmatrix}2n\\n-1\\\end{pmatrix} Cn=n+1(2nn)=(n+1)!n!(2n)!=k=2nkn+k=i=0n1CiCni=n+12(2n1)Cn1=(2nn)(2nn1)

推导

考虑 n × n n\times n n×n的网格,只能向上或者向右走,且不能超过 y = x y=x y=x这条对角线
问:从 ( 0 , 0 ) (0,0) (0,0)走到 ( n , n ) (n,n) (n,n)有多少种走法

解:从 ( 0 , 0 ) (0,0) (0,0)走到 ( n , n ) (n,n) (n,n)的方案数需要向右走 n n n次和向上走 n n n
其实就是说每一步,向右次数必须要大于等于向上走的次数

如果不考虑对角线这个限制,总共有 ( 2 n n ) \begin{pmatrix}2n\\n\\\end{pmatrix} (2nn)总走法

接着考虑不合法的走法
不合法也就意味着经过了 y = x + 1 y=x+1 y=x+1这一条直线
设第一次在 P P P点接触到 y = x + 1 y=x+1 y=x+1
此时向上走的次数比向右走的次数多1
也就是说从 P P P点到 ( n , n ) (n,n) (n,n),向右走的次数会比向左走的次数多1
P P P点到 ( n , n ) (n,n) (n,n)的路径中,向右和向上对调(即沿着 y = x y=x y=x翻转)
那么最后将会到达 ( n − 1 , n ) (n-1,n) (n1,n)

也就是说所有的不合法的路径,经过这个操作都会到达 ( n − 1 , n ) (n-1,n) (n1,n)
因为这个翻转操作是可逆的,所以不合法路径和到达 ( n − 1 , n ) (n-1,n) (n1,n)的路径构成一个双射

那么合法的数量就是 ( 2 n n ) − ( 2 n n − 1 ) \begin{pmatrix}2n\\n\end{pmatrix}-\begin{pmatrix}2n\\n-1\\\end{pmatrix} (2nn)(2nn1)
在这里插入图片描述
(图来自wiki,红色虚的折线是不合法路径,红色实的折线是翻转后)

还有一种推导方法
因为向右次数必须要大于等于向上走的次数
所以设向右走为 ( x ′ , y ′ ) = ( x + 1 , y + 1 ) (x',y')=(x+1,y+1) (x,y)=(x+1,y+1)
所以设向上走为 ( x ′ , y ′ ) = ( x + 1 , y − 1 ) (x',y')=(x+1,y-1) (x,y)=(x+1,y1)
最终目标是走到 ( 2 n , 0 ) (2n,0) (2n,0)
限制就是不能走到 y = − 1 y=-1 y=1,然后推导思路和上面一样

这种推导方法的有点是,假设不是到达 ( n , n ) (n,n) (n,n),而是 ( n , m ) (n,m) (n,m)也可以类似地分析出来

例子

括号匹配

给定n对括号,求括号正确配对的字符串数
例如:
n=0:空串,1种
n=1:(),1种
n=2: (()) ()(),2种
n=3:((())) ()(()) ()()() (())() (()()),5种
解:
观察最后一对括号,可以分为最后一对括号中括号匹配数和最后一对括号前的匹配数,然后相乘
f ( n ) f(n) f(n)为给定n对括号,括号正确配对的字符串数
f ( n ) = ∑ i = 0 n − 1 f ( i ) f ( n − i ) f(n)=\sum_{i=0}^{n-1}f(i)f(n-i) f(n)=i=0n1f(i)f(ni)

也可以像推导种那样,向右次数必须要大于等于向上走的次数,这里每一个位置的左括号数必须大于右括号数
进而 f ( n ) = ( 2 n n ) − ( 2 n n − 1 ) f(n)=\begin{pmatrix}2n\\n\end{pmatrix}-\begin{pmatrix}2n\\n-1\\\end{pmatrix} f(n)=(2nn)(2nn1)

出栈序列

1 , 2 , ⋯   , n 1,2,\cdots, n 1,2,,n按顺序入栈(栈无限大),问出栈序列有多少种
解:
考虑 k k k最后一个出栈,

  • 那么 1 , 2 , ⋯   , k − 1 1,2,\cdots,k-1 1,2,,k1需要先出栈
  • 然后 k + 1 , ⋯   , n k+1,\cdots, n k+1,,n出栈
  • 最后 k k k出栈

f ( n ) f(n) f(n)为出栈序列数量
f ( n ) = ∑ i = 0 n − 1 f ( i ) f ( n − i ) f(n)=\sum_{i=0}^{n-1}f(i)f(n-i) f(n)=i=0n1f(i)f(ni)

二叉搜索树

n个数组成一棵二叉搜索树,问方案数
解:
设k为根,则 1 , 2 , ⋯   , k − 1 1,2,\cdots,k-1 1,2,,k1为左子树, k + 1 , ⋯   , n k+1,\cdots,n k+1,,n为右子树
f ( n ) f(n) f(n)为n个数组成一棵二叉搜索树的方案数
f ( n ) = ∑ i = 0 n − 1 f ( i ) f ( n − i ) f(n)=\sum_{i=0}^{n-1}f(i)f(n-i) f(n)=i=0n1f(i)f(ni)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nightmare004

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值