首页 > 代码库 > 关于Catalan数

关于Catalan数

问题的由来:编号为 1  n  n 个元素,顺序的进入一个栈,则可能的出栈序列有多少种? 

 

       对问题的转化与思考:个元素进栈和出栈,总共要经历 n 次进栈和 n 次出栈。这就相当于对这 2n 步操作进行排列。问题等价于:n1n0组成一2n位的2进制数,要求从左到右扫描,1的累计数不小于0的累计数,试求满足这条件的数有多少?

 

       解答: P2n为这样所得的数的个数。

 

2n位上填入n1的方案数为 Cn 2n)不填1的其余n位自动填以数0。从Cn 2n)中减去不符合要求的方案数即为所求。不合要求的数指的是从左而右扫描,出现0的累计数超过1的累计数的数。不合要求的数的特征是从左而右扫描时,必然在某一奇数2m+1位上首先出现m+10的累计数,和m1的累计数。此后的2nm)-1位上有nm1nm10。如若把后面这部分2nm)-1位,01交换,使之成为nm0nm11,结果得1个由n10n11组成的2n位数,即任何一个不合要求的数对应于一个由n10n11组成的一个排列。反过来,任何一个由n10n11组成的2n位数,由于0的个数多2个,2n是偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。 

    

        例如 10100101是由4041组成的82进制数。但从左而右扫描在第5位(显示为红色)出现0的累计数3超过1的累计数2,它对应于由3150组成的10100010。反过来 10100010对应于 10100101

 

      因而不合要求的2n位数与n10n11组成的排列一一对应,故有P2n  Cn 2n)— Cn1 2n

 

类似问题 买票找零

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

 

 

凸多边形三角划分

 

在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数fn)。

分析

 

因为凸多边形的任意一条边必定属于某一个三角形,所以我们以某一条边为基准,以这条边的两个顶点为起点P1和终点PnPPoint),将该凸多边形的顶点依序标记为P1P2、……、Pn,再在该凸多边形中找任意一个不属于这两个点的顶点Pk2<=k<=n-1),来构成一个三角形,用这个三角形把一个凸多边形划分成两个凸多边形,其中一个凸多边形,是由P1P2,……,Pk构成的凸k边形(顶点数即是边数),另一个凸多边形,是由PkPk+1,……,Pn构成的凸n-k+1边形。

 

此时,我们若把Pk视为确定一点,那么根据乘法原理,fn)的问题就等价于——凸k多边形的划分方案数乘以凸n-k+1多边形的划分方案数,即选择Pk这个顶点的fn=fk)×fn-k+1)。而k可以选2n-1,所以再根据加法原理,将k取不同值的划分方案相加,得到的总方案数为:fn=f2fn-2+1+f3fn-3+1+……+fn-1f2)。看到此处,再看看卡特兰数的递推式(令h(0)=1,h(1)=1catalan数满足递推式[1]

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)),答案不言而喻,即为fn=hn-2

 

 

给定N节点,能构成多少种不同的二叉树?[7] 

关于Catalan数