用卡特兰数求解对于给定序列有多少种出栈情况
2016-05-22 10:03
260 查看
出栈次序
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。路边有个死胡同,只能容一辆车通过,是临时的检查站,如图
![](https://img-blog.csdn.net/20160522100438465)
X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?为了方便起见,假设检查站可容纳任意数量的汽车。显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。现在足足有16辆车啊,亲!需要你计算出可能次序的数目。
求解:f(16) = C(32,16)/17 = 35357670
题目模拟的就是进出栈操作,而对于有n个元素的进出栈的可能情况可以通过组合数学中的卡特兰数求解。
卡特兰数其前几项(从0开始计)为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
令h(0)=1,h(1)=1,catalan数满足递推式[1] :
h(n)= h(0)h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2) 通项为h(n-k)(k-1),下标求和后是(n-1)。
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式[2] :
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,…) , (C(2n,n)表示2n里取n的组合数)
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,…)
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
分析:设f(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则。由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有f(k-1)种,而之后比k大的值入栈,且都在k之前出栈,因此有f(n-k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,f(n-k)*f(k-1)种,求和便是Catalan递归式。
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。路边有个死胡同,只能容一辆车通过,是临时的检查站,如图
X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?为了方便起见,假设检查站可容纳任意数量的汽车。显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。现在足足有16辆车啊,亲!需要你计算出可能次序的数目。
求解:f(16) = C(32,16)/17 = 35357670
题目模拟的就是进出栈操作,而对于有n个元素的进出栈的可能情况可以通过组合数学中的卡特兰数求解。
卡特兰数其前几项(从0开始计)为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
令h(0)=1,h(1)=1,catalan数满足递推式[1] :
h(n)= h(0)h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2) 通项为h(n-k)(k-1),下标求和后是(n-1)。
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式[2] :
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,…) , (C(2n,n)表示2n里取n的组合数)
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,…)
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
分析:设f(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则。由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有f(k-1)种,而之后比k大的值入栈,且都在k之前出栈,因此有f(n-k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,f(n-k)*f(k-1)种,求和便是Catalan递归式。
相关文章推荐
- Programming Scala第5章demo04 传递变参
- 事务
- DOS中SET命令的详细用法
- N个数求和(cccc分数求和—gcd)
- Unity3D血条的制作
- 畅通工程(MST)
- LeetCode:Invert Binary Tree
- 写css的一些小技巧
- listview选中高亮,选中栏目变颜色的一种最简单办法
- 27. Remove Element
- spark ML 使用Word2Vec
- 冒泡排序——java
- 大整数类BigInteger
- k-means聚类算法
- Servlet中请求重定向和请求转发和include
- TCP与UDP的区别
- [hdu 4586] Play the Dice
- WPF 之 TreeView右键选中节点及节点重命名
- nodejs:生成树形目录
- 114. Flatten Binary Tree to Linked List