1.卡特兰数的性质

其实重要的就两个公式:1和3.

公式1是卡特兰数的通项公式。
公式2是卡特兰数的递归公式。注意递推公式是C n+1=…
通常是发现问题可以用卡特兰数的递推公式来解决,从而想到卡特兰数。

2.经典问题

1.出栈次序问题。 
一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
解:对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于任意时刻,出栈的操作数一定不超过入栈的操作数,因此输出序列的总数目为由左而右扫描由n个1和n个0组成的2n位二进制数中,1的累计数不小于0的累计数的方案种数。

2n位二进制数中填入n个1的方案数为c(2n,n)。从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。

不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m+1个0的累计数和m个1的累计数,此后的2(n-m)-1位上有n-m个1和n-m-1个0。如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m个0和n-m-1个1,结果得1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n+1个0和n-1个1组成的排列。

反过来,任何一个由n+1个0和n-1个1组成的2n位二进制数,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数。

因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。

显然,不符合要求的方案数为C(2n,n+1)。由此得出输出序列的总数目为C(2n,n) - C(2n,n+1) = 1/(n+1)*C(2n,n)。

2.括号化问题

一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的Dyck word:
XXXYYY , XYXXYY , XYXYXY , XXYYXY ,XXYXYY
将上例的X换成左括号,Y换成右括号,Cn表示所有包含n组括号的合法运算式的个数:
((())) , ()(()) , ()()() (())() , (()())

解:这个题目只要将上面证明过程中的1对应左括号,0对应右括号即可。

3.二叉树问题

有N个节点的二叉树共有多少种情形? n个节点的二叉树的所有可能形态数为Cn。

类似题目:
n个非叶节点的满二叉树的形态数(对称后得到的二叉树除非自己本身对称,否则算是不同)。
这里要求满二叉树,实际上就是在上一点的每个子节点的空儿子上都加上叶子,就形成了我们的图了,那么我们要求的结果就是Catalan数。

解1:(2)中的每个不同的括号串,一 一映射于二叉树的每一种情况。
解2:用递推公式可能更容易理解
设n个节点的二叉树有F(n)个,则分为根的左子树0各节点、右子树n-1个节点,跟的左子树1个节点、右子树n-2个节点,…:

F(n)= F(0)*F(n-1)+ F(1)*F(n-2)+ … + F(n-1)*F(0)= Cn。

4.将多边行划分为三角形问题。
n+1边形进行三角形分割(只连接顶点对形成n个三角形)数:

5. n×n格点中不越过对角线的单调路径的个数
Cn表示所有在n × n格点中不越过对角线的单调路径的个数。一个单调路径从格点左下角出发,在格点右上角结束,每一步均为向上或向右。计算这种路径的个数等价于计算Dyck word的个数: X代表“向右”,Y代表“向上”。下图为n = 4的情况:

解:我们将一条水平边记为1,垂直边记为0,那么就组成了一个n个,1和n个0的序列,同(1)。

6.阶梯切割问题

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

7.填数问题

在一个2*n的格子中填入1到2n这些数值使得每个格子内的数值都比其右边和上边的所有数值都小的情况数也是Cn。
或者
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
解:我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排.
用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种方案.
比如000000111111就对应着
第一排:0 1 2 3 4 5
第二排:6 7 8 9 10 11
010101010101就对应着
第一排:0 2 4 6 8 10
第二排:1 3 5 7 9 11
问题转换为,这样的满足条件的01序列有多少个。
观察1的出现,我们考虑这一个出现能不能放在第二排,显然,在这个1之前出现的那些0,1对应的人
要么是在这个1左边,要么是在这个1前面。而肯定要有一个0的,在这个1前面,统计在这个1之前的0和1的个数。
也就是要求,0的个数大于1的个数。

8.电影院买票问题:

有2n个人排队进电影院,票价是50美分。在这2n个人当中,其中n个人只有50美分,另外n个人有1美元(纸票子)。愚蠢的电影院开始卖票时1分钱也没有。问:有多少种排队方法使得每当一个拥有1美元买票时,电影院都有50美分找钱。(注:1美元=100美分拥有1美元的人,拥有的是纸币,没法破成2个50美分。)
解:50美分设为‘0’,1美元设为‘1’,构成任何子序列‘0’不比‘1’少的序列即可。跟(1)类似,Cn。

9.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

思路:以其中一个点为基点,编号为0,然后按顺时针方向将其他点依次编号。那么与编号为0相连点的编号一定是奇数,否则,这两个编号间含有奇数个点,势必会有个点被孤立,即在一条线段的两侧分别有一个孤立点,从而导致两线段相交。设选中的基点为A,与它连接的点为B,那么A和B将所有点分成两个部分,一部分位于A、B的左边,另一部分位于A、B的右边。然后分别对这两部分求解即可。
设问题的解f(n),那么f(n) = f(0)*f(n-2) + f(2)*f(n-4) + f(4)*f(n-6) + ……f(n-4)*f(2) + f(n-2)*f(0)。f(0)*f(n-2)表示编号0的点与编号1的点相连,此时位于它们右边的点的个数为0,而位于它们左边的点为2n-2。依次类推。
f(0) = 1, f(2) = 1, f(4) = 2。结合递归式,不难发现f(2n) 等于C(n)。

参考:
小思Catalan数
Catalan数——卡特兰数
从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南

卡特兰数Catalan相关推荐

  1. 卡特兰数 Catalan number

    卡特兰数 Catalan number 卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 74290 ...

  2. 卡特兰数Catalan number的应用

    卡特兰数(Catalan number)的应用 使用场景 计算公式   卡特兰数是一个特殊的数列,基于这个数列,可以找出很多有趣的问题,对于我们学计算机的而言,与这个数列打交道是不可避免了,举一个很经 ...

  3. 卡特兰数 Catalan数

    From: http://www.cppblog.com/MiYu/archive/2010/08/07/122573.html 维基百科资料: 卡塔兰数 卡塔兰数是组合数学中一个常出现在各种计数问题 ...

  4. 算法基础 - 数论 | 组合数学 卡特兰数(Catalan number)定义、证明及例题

    写在前面:卡特兰数这东西感觉挺常用的,并且公式很简单,那就花一下午总结一下,学点皮毛吧(反正遇到我还是不会 ) [PDF] 大三上组合数学课堂讲义 文章目录 卡特兰数定义 卡特兰数的性质 卡特兰数证明 ...

  5. java编程求卡特兰数_卡特兰数(Catalan Number)

    卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.该数在计算机专业中比较重要,有一些具体的应用实例.这篇文章主要分三部分: 卡特兰数递归式的含 ...

  6. 卡特兰数 Catalan

    做初赛题,回顾到以前学的一些知识,发现还有其他广泛的应用,所以在此记录并当作复习,若有不当之处,随时欢迎读者斧正. Catalan 卡特兰数又称卡塔兰数,卡特兰数是组合数学中一个常出现在各种计数问题中 ...

  7. 出栈顺序 与 卡特兰数(Catalan)的关系

    一,问题描述 给定一个以字符串形式表示的入栈序列,请求出一共有多少种可能的出栈顺序?如何输出所有可能的出栈序列? 比如入栈序列为:1 2 3  ,则出栈序列一共有五种,分别如下:1 2 3.1 3 2 ...

  8. 卡特兰数——Catalan数

    卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项公式为  通常使用的递归式:  h(n)=((4*n-2) ...

  9. 卡特兰数[catalan数]`

    定义: 卡特兰数又叫卡塔兰数,是组合数学中一类常用的数列.前几项为:1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 74290 ...

最新文章

  1. C#网页数据采集(三)HttpWebRequest
  2. golang rpc的两种调用方法
  3. 恢复win8桌面上计算机图标,win8系统桌面我的电脑图标不见了如何找回
  4. 三个程序代码托管平台出现勒索事件? 建议启用多因素验证以保护账户
  5. 【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
  6. url 转换中文_数字快速转换成中文大写,我有妙招
  7. text html mime img,使用Python的email.mime.multipart发送HTML邮件时命...
  8. 初学Python之利用map编写姓名格式化输出函数
  9. Linux安装显卡驱动后闪屏问题
  10. linux下golang protoc安装详细教程
  11. 脑洞啊!3D打印数字式日晷,原理简单,设计巧妙
  12. 在Cadence中使用ADE进行蒙特卡洛仿真
  13. 【学习率】torch.optim.lr_scheduler学习率10种调整方法整理
  14. 基于AD9854个和MSP430的波形发生器
  15. android drawText()方法中x,y坐标值真正的 意义
  16. 虎牙在全球 DNS 秒级生效上的实践
  17. html5中hr是什么意思,【hr是什么意思】hr的意思_hr指的是什么_亲亲宝贝网
  18. 自制Runtime:虚拟执行环境设计
  19. 笔记本网卡总断连,如何使得网卡不自动休眠?
  20. html百度地图获取城镇街道,百度地图定位得到当前位置(省、市、区县、街道、门派号码)...

热门文章

  1. ES数据架构与关系数据库Mysql对比,例如mysql库对应es索引
  2. Hbase葱岭探秘--JavaApi实践
  3. AVM环视拼接方法介绍
  4. JS 高级(二)闭包、封装
  5. grep命令详解(如何匹配多个字符串)(grep指令)(grep -q)
  6. java ajax serialize,jQuery使用serialize(),serializeArray()方法取得表单数据
  7. html制作svg工具,使用Adobe Illustrator制作SVG的操作流程
  8. JQuery原理解析
  9. css 一行超出显示省略号 多行超出显示省略号
  10. c++中的sort函数