卡特兰数

传送门

 卡特兰递推公式

1. C_n = /frac{1}{n+1}{2n/choose n} = /frac{(2n)!}{(n+1)!/,n!} /quad n/ge 0  

2. C_n = {2n/choose n} - {2n/choose n+1} /quad n/ge 0

3. C_0 = 1 /quad , /quad C_{n+1}=/frac{2(2n+1)}{n+2}C_n

4. /begin{displaymath}C_0 = 1 /quad , /quad C_{n+1}=/sum_{i=0}^{n}C_i/,C_{n-i}/quad n/ge 0/end{displaymath}

5. /begin{displaymath}C_n= /frac 1{n+1} /sum_{i=0}^n {n /choose i}^2/end{displaymath}


卡特兰数的应用

1. 由n个+1和n个-1构成2n项a_1,a_2,...,a_n其部分和满足a_1 + a_2 + ... + a_k /ge 0 /quad , /quad 0 /le k /le 2n的序列个数等于第n个Catalan数C_n

假设不满足条件的序列个数为U_n,那么就有C_n + U_n = {2n /choose n}。而对于不满足的序列,必然存在某一个奇数位使a_1 + a_2 + ... + a_k < 0,而且+1的个数恰好比-1的个数少一个,此时我们将前k项中的+1变为-1,将-1变为+1,那么就得到一个有(n+1)个+1和(n-1)个-1的序列,即一个不满足条件的序列对应于一个由n+1个+1和n-1个-1组成的排列。所以 U_n = {2n/choose n + 1}。那么C_n = {2n/choose n} - U_n = {2n/choose n} - {2n/choose n + 1}}}


2. 我们可以将应用1变换形式:将-1看成右括号,+1看成左括号,就变成了左括号和右括号各有n个时,合法括号表达式的个数。比如2个左括号和2个右括号组成的合法表达式有C_2 = 2种,是()()和(())。


3. 再次转换形式,对于n+1个数连乘,乘法顺序有C_n种,比如三个数连乘a*b*c,n=2,相当于在式子上加括号,有2种乘法顺序,分别是(ab)c和a(bc)。四个数连乘a*b*c*d,n=3,有5种乘法顺序,分别是a(b(cd)),(ab)(cd),((ab)c)d,(a(bc))d和a((bc)d)。同时对于n为3得到合法的括号序列有5个,分别是:((())),()(()),()()(),(())()和(()()),也即与n+1个数连乘的顺序数一一对应关系。


4. n个节点构造二叉树的所有可能形态数为C_n。考虑随便取一个节点作为根,那么他左边和右边的儿子节点个数就确定了,假定根节点标号为x,那么左子树的标号就是从1到x-1,共x-1个,右子树的标号就是从x+1到n,共n-x个,那么将x从1取到n,就获得了所有的情况数/begin{displaymath}C_n = /sum_{i = 0}^{n - 1}C_i/,C_{n - i - 1}/end{displaymath}


5. n个非叶节点的满二叉树的形态数(对称后得到的二叉树除非自己本身对称,否则算是不同)

对于满二叉树,实际上就是将应用4中的每个子节点的空儿子上都加上叶子,就形成了对应的满二叉树,那么n个非叶节点形成的满二叉树的形态数即为Cn


6. 对于一个n*n的正方形网格,每次只能向右或者向上移动一格,那么从左下角到右上角所有在副对角线右下方的路径总数为C_n

可以将一条水平边记为+1,垂直边记为-1,那么就组成了一个n个+1和n个-1的序列,并且保证前k步中水平边数不小于垂直边数,换句话说前k个元素的和非负。


7. 对凸n+2边形进行不同的三角形分割(只连接顶点对形成n个三角形)数为Cn

8. n个数入栈后的出栈的排列总数是C_n。例如1,2,3入栈的出栈排序有123,132,213,231和321五种


9. 对于集合/{1,2,...,2n/},将集合元素两两分为n个子集,若任意两个子集都不交叉,那么我们称此划分为一个不交叉划分。此时不交叉的划分数就是C_n。考虑将每个子集中较小的数用左括号代替,较大的用右括号代替,那么带入原来的1至2n的序列中就形成了合法括号问题。例如集合{1,2,3,4,5,6}的不交叉划分有五个:{{1,2},{3,4},{5,6}},{{1,2},{3,6},{4,5}},{{1,4},{2,3},{5,6}},{{1,6},{2,3},{4,5}}和{{1,6},{2,5},{3,4}}。


10. n层的阶梯切割为n个矩形的切法数也是C_n。如下图所示:

 考虑先绘制如下图片,即n为5的时候的阶梯:

注意到每个切割出来的矩形都必需包括一块标示为*的小正方形,那么此时枚举每个*与#标示的两角作为矩形,剩下的两个小阶梯就是我们的两个更小的子问题了,于是我们的C_5 = C_0 * C_4 + C_1 * C_3 + C_2 * C_2 + C_1 * C_3 + C_0 * C_4


11. 在一个2*n的格子中填入1到2n这些数值使得每个格子内的数值都比其右边和上边的所有数值都小的情况数也是C_n


12. 平面上连接可以形成凸包的2n个点分成2个一组连成n条线段,两两线段之间不相交的情况总数是C_n,这里实际上和应用7本质上是一样的。


13. n+m个人排队买票,并且满足n /ge m,票价为50元,其中n个人各手持一张50元钞票,m个人各手持一张100元钞票,初始时候售票窗口没有钱,问有多少种排队的情况数能够让大家都买到票。

如果m=n的话那么这就是初始的Catalan数问题,也就是将手持50元的人看成是+1,手持100元的人看成是-1,任前k个数值的和都非负的序列数。

对于n>m的情况,假设大家都可以买到票的情况数是D_{n+m},无法让每个人都买到的情况数是U_{n + m},那么就有D_{n + m} + U_{n +m} = {n + m /choose n},假设最早买不到票的人编号是k,他手持的是100元并且售票处没有钱,那么将前k个人的钱从50元变成100元,从100元变成50元,这时候就有n+1个人手持50元,m-1个手持100元的,所以就得到U_{n + m} = {n + m /choose n + 1},同时D_{n + m} = {n + m /choose n} - {n + m /choose n + 1}


<think>好的,用户想了解卡特兰与栈的关系和应用,包括公式、应用场景和实现方法。首先,我需要回忆卡特兰的基本定义和公式,确保正确性。根据引用[1]和[3],卡特兰在组合学中有多种应用,包括栈排序问题。 卡特兰的递推公式和通项公式是关键。引用[3]提到递推关系是分治思想,f(n) = Σf(k-1)f(n-k)对k求和。而通项公式应该是C(n) = (1/(n+1))C(2n, n),需要确认是否正确,同时引用[4]中的组合计算可能相关。 接下来是栈的应用场景。栈的合法出栈序列目是经典的卡特兰应用,比如n个元素的进栈和出栈顺序。需要解释具体场景,比如可能的出栈序列目等于第n个卡特兰。引用[3]中的例子提到将k作为分界点,用乘法原理计算,所以可能需要详细说明这个过程。 实现方法部分,用户可能需要递归或动态规划的代码示例。引用[4]中的组合计算代码可能可以借鉴,但需要调整以计算卡特兰。另外,可能需要给出递推实现的代码,或者直接使用通项公式计算。 还要注意引用来源,用户提供的引用[1]、[3]、[4]都涉及卡特兰的定义和应用,需要正确对应到回答中。比如,引用[3]详细解释了递推关系,而引用[1]提到栈排序问题,这些都是关键点。 需要检查是否有遗漏的应用场景,比如除了出栈序列,是否还有其他栈相关的应用,比如括号匹配,但用户可能只关注栈的应用,所以重点放在出栈序列上。 最后,确保使用正确的中文表达,学公式用$...$和$$...$$格式,代码块用正确语法。例如,递推公式用行内公式,通项公式用独立公式。代码示例可能需要展示如何计算卡特兰,比如递归或动态规划方法。 总结步骤:先介绍卡特兰的定义和公式,再详细说明其在栈中的应用场景(如出栈序列目),最后给出实现方法,可能包括递推或组合计算的代码,并正确引用相关来源。</think>### 卡特兰与栈的关系及应用 #### 1. 卡特兰公式 卡特兰的定义和公式可通过以下方式表达: - **递推公式**: $$C_0 = 1,\quad C_{n+1} = \sum_{i=0}^{n} C_i C_{n-i} \quad (n \geq 0)$$ 例如,$C_1 = C_0C_0 = 1$,$C_2 = C_0C_1 + C_1C_0 = 2$,依此类推[^1][^3]。 - **通项公式**: $$C_n = \frac{1}{n+1} \binom{2n}{n}$$ 其中 $\binom{2n}{n}$ 是组合,表示从 $2n$ 个元素中选 $n$ 个的方式[^4]。 --- #### 2. 栈中的应用场景 卡特兰在**合法出栈序列**问题中有核心应用: - **问题描述**:假设元素按顺序 $1,2,\dots,n$ 依次入栈,允许任意时刻出栈,求合法的出栈序列总。 - **学对应**:此问题等价于求第 $n$ 个卡特兰 $C_n$。例如,当 $n=3$ 时,有 $C_3=5$ 种合法出栈序列。 **原理分析**: 递推关系来源于分治思想。假设元素 $k$ 是最后一个出栈的,则: 1. 元素 $1,2,\dots,k-1$ 的出栈序列有 $C_{k-1}$ 种。 2. 元素 $k+1,\dots,n$ 的出栈序列有 $C_{n-k}$ 种。 总为 $\sum_{k=1}^{n} C_{k-1}C_{n-k}$,即卡特兰的递推公式。 --- #### 3. 实现方法 ##### (1) 动态规划实现 通过递推公式计算卡特兰: ```python def catalan(n): dp = [0] * (n+1) dp[0] = 1 for i in range(1, n+1): for j in range(i): dp[i] += dp[j] * dp[i-j-1] return dp[n] ``` ##### (2) 组合公式实现 利用通项公式计算: ```python from math import comb def catalan(n): return comb(2*n, n) // (n + 1) ``` --- #### 4. 扩展应用 除出栈序列外,卡特兰还应用于: - **括号匹配**:$n$ 对括号的合法排列为 $C_n$。 - **二叉树结构**:$n$ 个节点构成的不同二叉搜索树量为 $C_n$[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值