本文主要是介绍卡特兰数(Catalan)的原理和题目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) +h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:
证明:
令1表示进栈,0表示出栈,则可转化为求一个2n位、含n个1、n个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数(也就是1的个数>=0的个数)。显然含n个1、n个0的2n位二进制数共有个,可以理解为
下面考虑不满足要求的数目。用上面的所有组合数减去不满足的要求的数量
考虑一个含n个1、n个0的2n位二进制数,扫描到第2m+1位上时有m+1个0和m个1(容易证明一定存在这样的情况),然后互0和1的值,则后面的0排列中必有n-m个1和n-m-1个0。将2m+2及其以后的部分0变成1、1变成0,则对应一个n+1个0和n-1个1的二进制数。反之亦然(相似的思路证明两者一一对应)。
从而
证毕。
个人理解
解答: 设P2n为这样所得的数的个数。在2n位上填入n个1的方案数为 C(n 2n)
不填1的其余n位自动填以数0。从C(n 2n)中减去不符合要求的方案数即为所求。
不合要求的数指的是从左而右扫描,出现0的累计数超过1的累计数的数。
不合要求的数的特征是从左而右扫描时,必然在某一奇数2m+1位上首先出现m+1个0的累计数,和m个1的累计数。
此 后有n-m个1,n-m-1个0。如若把后面这部分0与1交换,使之成为n-m个0,n-m-1个1,结果得 1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n-1个1和n+1个0组成的一个排列。
反过来,任何一个 由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位数,必对应于一个不合要求的数。
用上述方法建立了由n+1个0和n-1个1组成的2n位数,与由n个0和n个1组成的2n位数中从左向右扫描出现0的累计数超过1的累计数的数一一对应。
- 1 带限制条件的路径总数
- 2 括号序列计数
- 3 出栈顺序
- 4 排队问题
- 5 二叉树计数
- 6 机器人回到原点
这篇关于卡特兰数(Catalan)的原理和题目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!