【知识总结】卡特兰数 (Catalan Number) 公式的推导
卡特兰数的英文维基讲得非常全面,强烈建议阅读!
Catalan number - Wikipedia
(本文中图片也来源于这个页面)
由于本人太菜,这里只选取其中两个公式进行总结。
(似乎就是这两个比较常用?)
首先先扔卡特兰数的定义式
\[Catalan_n=\prod_{i=1}^{n-1}Catalan_i*Catalan_{n-i}\]
(卡特兰数的很多应用,比如二叉树形态数,出栈序列数等,都由这个定义式得到。详见英文维基)
公式1 (通项公式) :
\[Catalan_n=\frac{1}{n+1}C_{2n}^n\]
在上文提到的出栈序列的问题情景中,如果有\(n\)个元素,在平面直角坐标系中用\(x\)坐标表示入栈数,\(y\)坐标表示出栈数,则坐标\((a,b)\)表示目前已经进行了\(a\)次入栈和\(b\)次出栈,则再进行一次入栈就是走到\((a+1,b)\),再进行一次出栈就是走到\((a,b+1)\)。并且,由于入栈数一定小于等于出栈数,所以路径不能跨越直线\(y=x\)
因此,题目相当于求从\((0,0)\)走到\((n,n)\)且不跨越直线\(y=x\)的方案数
首先,如果不考虑不能跨越直线\(y=x\)的要求,相当于从\(2n\)次操作中选\(n\)次进行入栈,则方案数为\(C_{2n}^n\)。
然后,考虑对于一种不合法的方案,一定在若干次操作后有一次出栈数比入栈数多一次,这个点在直线\(y=x+1\) (即下图中红色的线) 上。那么把第一次碰到该直线以后的部分关于该直线对称,则最终到达的点是\((n-1,n+1)\) (如下图) 。
![]()
图源:英文维基 (即文首网址)
显然,任何非法方案都可以通过此方式变成一条从\((0,0)\)到\((n-1,n+1)\)的路径,有\(C_{2n}^{n+1}\)种。而任何合法方案由于不接触直线\(y=x+1\),无论从哪个点对称都不是一条连续的路径。由于合法方案数就是\(Catalan_n\),所以:
\[
\begin{aligned}
Catalan_n&=C_{2n}^n-C_{2n}^{n+1}\\
&=\frac{(2n)!}{n!*n!}-\frac{(2n)!}{(n+1)!*(n-1)!}\\
&=\frac{1}{n+1}(\frac{(2n)!*(n+1)}{n!*n!}-\frac{(2n)!}{n!*(n-1)!})\\
&=\frac{1}{n+1}(\frac{(2n)!*(n+1)}{n!*n!}-\frac{(2n)!*n}{n!*n!})\\
&=\frac{1}{n+1}*\frac{(2n)!*(n+1)-(2n)!*n}{n!*n!}\\
&=\frac{1}{n+1}*\frac{(2n)!}{n!*n!}\\
&=\frac{1}{n+1}C_{2n}^n\\
\end{aligned}
\]
公式2 (递推公式) :
\[Catalan_{n+1}=\frac{4n+2}{n+2}Catalan_n\]
(这个公式的推导过程似乎网上没有,估计是思路太简单了……我太菜了想了半天才推出来)
由上面那个通项公式得
\[
\begin{aligned}
Catalan_{n+1}&=\frac{1}{n+2}C_{2n+2}^{n+1}\\
&=\frac{1}{n+2}*\frac{(2n+2)!}{(n+1)!*(n+1)!}\\
&=\frac{1}{n+2}*\frac{(2n)!*(2n+1)*(2n+2)}{n!*n!*(n+1)^2}\\
&=\frac{1}{n+2}*\frac{(2n+1)*(2n+2)}{(n+1)}*\frac{1}{n+1}*\frac{(2n)!}{n!*n!}\\
&=\frac{2(2n+1)}{n+2}*\frac{1}{n+1}*C_{2n}^n\\
&=\frac{4n+2}{n+2}Catalan_n\\
\end{aligned}
\]
【知识总结】卡特兰数 (Catalan Number) 公式的推导的更多相关文章
- 浅谈卡特兰数(Catalan number)的原理和相关应用
一.卡特兰数(Catalan number) 1.定义 组合数学中一个常出现在各种计数问题中出现的数列(用c表示).以比利时的数学家欧仁·查理·卡特兰的名字来命名: 2.计算公式 (1)递推公式 c[ ...
- 卡特兰数 catalan number
作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...
- 卡特兰数(Catalan Number) 算法、数论 组合~
Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为( ...
- 卡特兰数(Catalan Number) 学习笔记
一.三个简单的问题 1.给定一串长为2n的01序列,其中0和1的数量相等,满足任意前缀中0的个数不少于1的个数,求序列的个数 2.给出一串长为n的序列,按顺序将他们进栈,随意出栈,求最后进出栈的方案 ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- 卡特兰数 Catalan 笔记
一.公式 卡特兰数一般公式 令h(0)=1,h(1)=1,catalan数满足递推式.h(n) = h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>= ...
- 卡特兰数Catalan——定义、公式、模型总结
推荐:卡特兰数总结 定义: f(i)表示,从(0,0)出发,到(i,i),每次只能向上或者向右走,并且不越过红线的方案数. 这个图片的点上的数字,其实告诉我们f[i],就可以根据这个n方dp得到. 其 ...
- ACM数论-卡特兰数Catalan
Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...
随机推荐
- (一)python条件语句和基本数据类型
条件语句 语法一:if...else if <条件成立>: 处理过程 else: 处理过程 语法二:if...elif...else if <条件1成立>: 处理过程1 el ...
- 洛谷 1017 进制转换 (NOIp2000提高组T1)
[题解] 纯模拟题. 我们都知道十进制数化成m进制数可以用短除法,即除m取余.逆序排列.而m进制数化为十进制数,按权展开求和即可. 但在本题中进制的基数R可能为负数,我们知道a%R的符号与R一致,也就 ...
- 3.8.5 多重选择:switch语句
在处理多个选项时,使用if/else结构显得有些笨拙. Scanner in = new Scanner(System.in); Syste ...
- java 反射运用
一,获取私有的属性,方法,构造器(俗名:暴力反射) 现有一个类,属性,方法,构造器均为私有的,如何创建实例对象,更该属性值,调用方法? public class Student { private S ...
- git命令大杂烩
查看版本库中的文件: git ls-files添加到暂存区: git add filesName|\folderName(循环递归) git add .(添加当前目录下的所有文件包括子目录,如果添加文 ...
- [luoguP1736] 创意吃鱼法(DP)
传送门 f[i][j][0] 表示从右下角到左上角,以(i,j)为起点能延伸的最大值 f[i][j][1] 表示从左下角到右上角,以(i,j)为起点能延伸的最大值 up[i][j] 表示(i,j)上面 ...
- Navicat使用技巧
1.有时按快捷键Ctrl+F搜某条数据的时候搜不到,但是能用sql查出来,这是怎么回事? Ctrl+F只能搜本页数据,不在本页的数据搜不到,navicat每页只显示1000条数据.在数据多的时候nav ...
- bzoj4518征途 斜率优化
征途这是一道十分经典的斜率优化 我们可以从题目中的方差来想,也就很容易的到这个式子 \[ans=m^2*\frac{\sum_{i=1}^{m}{(x_i-{\overline{x}})^2}}{m} ...
- Calculate S(n)
Problem Description Calculate S(n). S(n)=13+23 +33 +......+n3 . Input Each line will contain one i ...
- vue2源码浏览分析01
1.构造函数 Vue$3 function Vue$3 (options) { if ("development" !== 'production' && !(t ...