深入理解卡特兰数及其应用_C 语言

Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。

令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>=2)

catalan数公式的一般是形式为:

                                                         

递推关系:

它也满足

 
这提供了一个更快速的方法来计算卡塔兰数。

卡特兰数的应用n个元素顺序入栈,出栈顺序有多少种?此问题是一个卡特兰数问题,证明过程如下:

令1表示进栈,0表示出栈,则可转化为求一个2n位、含n个1、n个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数。显然含n个1、n个0的2n位二进制数共有个,下面考虑不满足要求的数目。

考虑一个含n个1、n个0的2n位二进制数,扫描到第2m+1位上时有m+1个0和m个1(容易证明一定存在这样的情况),则后面的0-1排列中必有n-m个1和n-m-1个0。将2m+2及其以后的部分0变成1、1变成0,则对应一个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)。

从而。证毕。

括号化问题   如,矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

出栈次序问题  
1、一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
2、有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)。

将多边行划分为三角形问题  
1、将一个凸多边形区域分成三角形区域的方法数?
2、一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
3、在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

给顶节点组成二叉树的问题  给定N个节点,能构成多少种不同的二叉树?

一些笔试题
1、16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。
h(8)=16!/(8!*9!)=1430,所以总数=h(8)*8!*8!=16!/9
2、在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?
h(3)=6!/(3!*4!)=5,所以总数=h(3)*3!*3!=180

时间: 2024-12-31 19:51:32

深入理解卡特兰数及其应用_C 语言的相关文章

对C语言中指针的理解与其基础使用实例_C 语言

C语言的指针,关键意思在于"指". "指"是什么意思? 其实完全可以理解为指示的意思.比如,有一个物体,我们称之为A.正是这个物体,有了这么个称谓,我们才能够进行脱离这个物体的实体而进行一系列的交流.将一个物体的指示,是对这个物体的抽象.有了这种抽象能力,才有所谓的智慧和文明.所以这就是"指示"这种抽象方法的威力. 退化到C语言的指针,指针是一段数据/指令(在冯诺易曼体系中,二者是相通,在同一空间中的)的指示.这是指示,也就是这段数据/指令的起始

深入理解C/C++混合编程_C 语言

在工作中,C.C++密不可分,做我们嵌入式方面的,当然更多的是C,但,有时候却少不了C++,而且是C.C++混搭(混合编程)在一起的,比如,RTP视频传输,live555多媒体播放等都是C++下的,他需要调用JRTPLIB库,再比如,我那邮件发送,我也用C++写的,定义了一个Email对象,包含了成员:收发邮件地址,用户名,密码等,以及方法:邮件头.Base64编码和邮件发送这些操作,很好用,所以,很多时候,C++还是蛮不错的....但,*.c与*.cpp文件混搭在一起,不是那么的简单,知识总是

深入理解c/c++ 内存对齐_C 语言

内存对齐,memory alignment.为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐.原因在于,为了访问未对齐的内存,处理器需要作两次内存访问:然而,对齐的内存访问仅需要一次访问.内存对齐一般讲就是cpu access memory的效率(提高运行速度)和准确性(在一些条件下,如果没有对齐会导致数据不同步现象).依赖cpu,平台和编译器的不同.一些cpu要求较高(这句话说的不准确,但是确实依赖cpu的不同),而有些平台已经优化内存对齐问题,不同编译器的对齐模数不同.总

在C语言编程中设置和获取代码组数的方法_C 语言

C语言setgroups()函数:设置组代码函数头文件: #include <grp.h> 定义函数: int setgroups(size_t size, const gid_t * list); 函数说明:setgroups()用来将list 数组中所标明的组加入到目前进程的组设置中. 参数size 为list()的gid_t 数目, 最大值为NGROUP(32). 返回值:设置成功则返回0, 如有错误则返回-1. 错误代码: EFAULT:参数list 数组地址不合法. EPERM:权限

深入理解c++中virtual关键字_C 语言

1.virtual关键字主要是什么作用?c++中的函数调用默认不适用动态绑定.要触发动态绑定,必须满足两个条件:第一,指定为虚函数:第二,通过基类类型的引用或指针调用.由此可见,virtual主要主要是实现动态绑定. 2.那些情况下可以使用virtual关键字?virtual可用来定义类函数和应用到虚继承. 友元函数 构造函数 static静态函数 不能用virtual关键字修饰:普通成员函数 和析构函数 可以用virtual关键字修饰: 3.virtual函数的效果 复制代码 代码如下: cl

大数(高精度数)模板(分享)_C 语言

复制代码 代码如下: #include <stdio.h>#include <string.h> #include <stdlib.h> #include <math.h>#include <assert.h>  #include <ctype.h> #include <map>#include <string>#include <set>#include <bitset>#includ

获取一个文件行数的方法_C 语言

第一种方法 思路:将文件中的字符一个一个读出,然后与 \n 作比较. 复制代码 代码如下:      #include <stdio.h>      #include <string.h>       #include <errno.h>                int main(int argc, char *argv[])       {            FILE *fp;            int n = 0;           int ch; 

UVa 10303 How Many Trees? (卡特兰数&amp;amp;高精度)

10303 - How Many Trees? Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1244 A binary search tree is a binary tree with root k such that any node v in th

演讲实录丨胡郁 从“能听会说”到“能理解会思考”-以语音和语言为入口的认知革命

从"能听会说"到"能理解会思考" -以语音和语言为入口的认知革命 胡郁 中国人工智能学会企业副理事长.科大讯飞轮值总裁   胡郁:我主要分享三个方面内容:关于人工智能.关于讯飞的人工智能.机器人和人工智能之间的联系.     人工智能这个词非常热,今年是人工智能六十周年,让我们再次向这些人工智能的先驱致敬.十年前五十周年,这些耄耋老人都成为图灵奖创始人和诺贝尔奖获得者,但是在五十年前,他们都是像我们一样的年轻的研究学家,美国在这方面的前瞻性,在六十周年这个时候,当时