出栈次序
来源:互联网 发布:2017年中日贸易数据 编辑:程序博客网 时间:2024/04/29 09:59
来源:第五届蓝桥杯软件大赛C/C++本科B组决赛第二题
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
路边有个死胡同,只能容一辆车通过,是临时的检查站,如图【p1.png】所示。
X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。
如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车。
显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。
现在足足有16辆车啊,亲!需要你计算出可能次序的数目。
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性文字)。
看到这张图,再联系一下题目,这道题问其实就是16个数进栈,有多少种出栈的可能。
如果大家对catalan数熟悉的话,就能知道这是求catalan数h(n)=C(2n,n)/(n+1) (C(2n,n)表示2n里取n);很明显如果直接进行模拟的话,时间复杂度太高,一时半会儿出不来结果;
其实每次不外乎两种可能:进栈和出栈。因此我们也可以考虑一下用动态规划解决这个问题。
我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出
f(1) = 1 //即 1
f(2) = 2 //即 12、21
f(3) = 5 //即 123、132、213、321、231
然后我们来考虑f(4), 我们给4个元素编号为a,b,c,d, 那么考虑:元素a只可能出现在1号位置,2号位置,3号位置和4号位置(很容易理解,一共就4个位置,比如abcd,元素a就在1号位置)。
分析:
1) 如果元素a在1号位置,那么只可能a进栈,马上出栈,此时还剩元素b、c、d等待操作,就是子问题f(3);
2) 如果元素a在2号位置,那么一定有一个元素比a先出栈,即有f(1)种可能顺序(只能是b),还剩c、d,即f(2), 根据乘法原理,一共的顺序个数为f(1) * f(2);
3) 如果元素a在3号位置,那么一定有两个元素比1先出栈,即有f(2)种可能顺序(只能是b、c),还剩d,即f(1),
根据乘法原理,一共的顺序个数为f(2) * f(1);
4) 如果元素a在4号位置,那么一定是a先进栈,最后出栈,那么元素b、c、d的出栈顺序即是此小问题的解,即 f(3);
结合所有情况,即f(4) = f(3) + f(2) * f(1) + f(1) * f(2) + f(3);
为了规整化,我们定义f(0) = 1;于是f(4)可以重新写为:
f(4) = f(0)*f(3) + f(1)*f(2) + f(2) * f(1) + f(3)*f(0)
然后我们推广到n,推广思路和n=4时完全一样,于是我们可以得到:
f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-1)*f(0)
即
下面就是按这个思路解决问题的dp算法,复杂度为O(n^2)
public class StackOrder{// n 个等着进栈,栈中有m个static int f(int n, int m) {if (n == 0)return 1;if (m == 0)return f(n - 1, 1);return f(n, m - 1) + f(n - 1, m + 1);}static int f(int n) {return f(n, 0);}public static void main(String[] args) {for (int i = 1; i < 17; i++) {System.out.println(i + ": " + f(i));}}}答案:35357670
- 出栈次序问题
- 出栈次序
- 出栈次序
- 蓝桥杯 出栈次序
- 关于出栈次序及Catalan函数
- 出栈次序 卡兰特数
- 蓝桥杯 出栈次序(java题解)
- 数据结构学习——栈的出栈次序及次序种类
- 判断一个序列的出栈次序是否合法
- 出栈次序问题---卡特兰属的另一种理解
- 递归输出所有出栈次序及卡塔兰数应用
- 1003. 射击游戏2(出栈次序问题)
- 2014年第五届蓝桥杯C/C++程序设计本科B组决赛 出栈次序(结果填空)
- 第五届蓝桥杯决赛 第二题 出栈次序(catalan数)
- 第五届蓝桥杯软件类国赛真题-C-B-2_出栈次序
- 2014年第五届蓝桥杯C/C++程序设计本科B组决赛 出栈次序(结果填空)
- 【2014年第五届蓝桥杯C/C++程序设计本科B组决赛 出栈次序(结果填空) 】
- 将元素a,b,c,d,e依次入栈,然后将d和e出栈,再将f和g进栈,最后将元素全部进栈,并将元素按照出栈次序输出
- iOS开发基础学习笔记——标签栏(UITabBar)
- Hadoop MapReduce 深入理解!二次排序案例!
- 拦截器和过滤器区别总结
- 现代浏览器工作原理
- JQuery Easy Ui dataGrid 数据表格
- 出栈次序
- c++第3次实验
- ubuntu上传代码github
- SQLite Page Cache之事务处理(2)
- 比较两个数据库所有表的字段
- Javascript模块化编程(一):模块的写法
- Linux 下系统调用的三种方法
- 开启线程池 加入任务 传入参数 此任务能够在执行完成时得到返回值
- Android中的Toast重复显示的问题