标准二维表问题,catalan数的应用
来源:互联网 发布:修容产品推荐 知乎 编辑:程序博客网 时间:2024/05/29 04:42
问题描述:
设n是一个正整数。2*n的标准二维表是由正整数1,2,…,2n组成的2*n数组,该数组的每行从左到右递增,每列从上到下递增。2*n的标准二维表全体记为tab(n)。例如,当n=3时,tab(3)二维表如下图所示。
1 2 3
4 5 6
1 2 4
3 5 6
1 2 5
3 4 6
1 3 4
2 5 6
1 3 5
2 4 6
编程任务:
给定正整数n,试计算tab(n)中2*n二维表的个数。
分析:
1. 先把2*n个数字排成一行来看(1~2*n 有序)。放到第一行的数字标记为0,放到第二行的数字标记为1,这样就可以有一个01的序列,题目要求前面的数字比后面和下面的数字小,这样可以转换为,序列前面每个数字前面0的个数要大于等于1的个数。
2. 就是求由左而右扫描由n个1和n个0组成的2n位二进制数,0的累计数不小于1的累计数的方案种数。
3. 这个数恰好是catalan数
算法实现
#include<iostream>using namespace std;int cantalan( int n){ if(n == 0 || n == 1) return 1; else{ return cantalan(n-1)*(4*n -2)/(n+1); }};int main(){ int size = 0; cin>>size; cout<<cantalan(size);}
只能说cantalan数应用范围太广了,领教了。
附:catalan数应用:
令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)
例如: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
另类递推式 :
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,…)
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,…)
应用例题
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
分析:
对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。
在2n位二进制数中填入n个1的方案数为c(2n,n),不填1的其余n位自动填0。从中减去不符合要求(由左而右扫描,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组成的排列。
显然,不符合要求的方案数为c(2n,n+1)。由此得出输出序列的总数目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)=h(n)。
类似问题 买票找零
有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
- 标准二维表问题,catalan数的应用
- catalan 数 标准二维表。 高精度计算。
- Catalan 数的应用
- Catalan数的一些应用
- Catalan数的应用场景
- 一类连线问题中栈和Catalan数的应用
- 标准二维表问题 (卡特兰数)
- Catalan数的分析和应用
- 【转载】Catalan数的分析和应用
- catalan数的应用 变形 HDU1133
- Catalan数的应用与代码实现
- 卡特兰数的应用 Catalan number
- HDU - 5673(catalan数的应用)
- 1133catalan数二维变种
- 卡特兰数在多种问题下的应用 组合数学-Catalan数
- Catalan数应用
- catalan数应用
- Catalan数应用
- 数据结构与算法基础学习(一)
- Windows XP Professional VOL版密钥
- Java的面向对象之多态和接口
- linux初学 unit12
- 【codeforces Gym
- 标准二维表问题,catalan数的应用
- PCA,SVD
- 纯CSS3实现不错的表单验证效果
- Linux新手生存笔记[1]——Linux目录结构及说明
- Android 多个Fragment切换动画
- 减少代码模块之间的纠葛——解耦
- Java Map的遍历
- 24点游戏
- 链表中倒数第k个结点