0x11栈之火车进栈
参考《算法竞赛进阶指南》p.49
题目链接:https://www.acwing.com/problem/content/description/131/
递推与递归的宏观描述
左侧图中,有几个人是原问题,从原问题往前推导是递推。于是从二叉树的最后一层往前推,推导到第一层则可以算出原问题的答案。
右侧图中,几个苹果是原问题。但是在这棵二叉树中,你并不知道有几层和结点的分布情况。对每一个子问题都是一颗二叉树,遍历左右子数,求出苹果,然后往回返回苹果数目。我们刚才也提到,使用递推或递归要求“原问题”与“问题边界”之间的每个变换步骤具有相似性,这样我们才能够设计一段程序实现这个步骤,将其重复作用于问题之中。换句话说,程序在每个步骤上应该面对相同种类的问题,这些问题都是原问题的一个子问题,可能仅在规模或者某些限制条件上有所区别,并且能够使用“求解原问题的程序”进行求解。
对于递归算法,有了上面这个前提,我们就可以让程序在每个变换步骤中执行三个操作:
2.尝试求解规模缩小以后的问题,结果可能是成功,也可能是失败。
3.如果成功,即找到了规模缩小后的问题的答案,那么将答案扩展到当前问题,如果失败,那么重新回到当前问题,程序可能会继续寻找当前问题的其他变换路线,直至最终确定当前问题无法求解。
在以上三个操作中有两点颇为关键。-是“如何尝试求解规模缩小以后的问题”。因为规模缩小以后的问题是原问题的一个子问题,所以我们可以把它视为一个新的“原问题”由相同的程序(上述三个操作)进行求解,这就是所谓的“自身调用自身”。二是如果求解子问题失败,程序需要重新回到当前问题去寻找其他的变换路线,因此把当前问题缩小为子问题时所做的对当前问题状态产生影响的事情应该全部失效,这就是所谓的“回溯时还原现场”。上面这类程序就是“递归”的遍历方式,其整体流程如下图所示。

可以看到,递归程序的基本单元是由“缩小”“求解” “扩展” 组成的种变换步骤,只是在“求解”时因为问题的相似性,不断重复使用了这样一种变换步骤, 直至在已知的问题边界上直接确定答案。对于其中任意一条从“原问题”到“问题边界”的变换路线(图中实线圈出的路径),横向来看,它的每层是次递归程序体的执行;纵向来看,它的左右两边分别是寻找路线和沿其推导的流程。为了保证每层的“缩小”与“扩展”能够衔接在同形式的问题上,“求解” 操作自然要保证在执行前后程序面对问题的状态是相同的,这也就是“还原现场”的必要性所在。
对于题目中问题:
面对任何一个状态我们只有两种选择:
1.把下一个数进栈
2.把当前栈顶元素出栈
先进行第二步操作比第一步操作的字典序小。
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack; public class Main {
static LinkedList<Integer> list=new LinkedList<Integer>();
static Stack<Integer> stack=new Stack<Integer>();
static LinkedList<Integer> ans=new LinkedList<Integer>();
static int cnt=20;
static int n=0;
static void dfs() {
if (cnt==0) {
return;
}
if (ans.size()==n) {
for (Integer integer : ans) {
System.out.print(integer);
}
System.out.println();
cnt--;
return;
} if (stack.size()!=0) {
int x=stack.pop();
ans.add(x);
dfs();
//System.out.println(ans.peekLast()==x);
stack.push(x);
ans.removeLast(); }
if (list.size()!=0) {
int s=list.getLast();
list.removeLast();
stack.push(s);
dfs();
list.add(s);
stack.pop();
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for (int i = n; i >=1; i--) {
list.add(i);
}
dfs();
} }
0x11栈之火车进栈的更多相关文章
- 火车进栈(进出栈的模拟,dfs爆搜)
这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头. 这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从 ...
- C语言实现链栈的初始化&进栈&出栈&读取栈顶元素
/*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...
- C语言实现顺序栈的初始化&进栈&出栈&读取栈顶元素
/*顺序表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define Stack_Size 50 //设栈中元素个数为50 ...
- 0x11栈之Editor
参考链接:https://blog.csdn.net/SSLGZ_yyc/article/details/81700623 对顶栈的思想: 建立两个栈,栈A存储从序列开头到当前光标的位置的一段序列,栈 ...
- tyvj/joyoi 1336 火车进栈
比原题水了很多(因为原题要高精度) 输出字典序前20种出栈序列. 其实是贪心题:我们每次确定一个出栈的数. 当栈里有数时,字典序显然比从后面拿数要小,所以先搜这个. 之后依次搜后面队列里的数,因为字典 ...
- 0x11 栈
这个不难吧,算是常识了..毕竟也是刷过USACO的人 对顶栈这东西前几天才遇到过,好像和在线求中位数那东西放一起了吧 单调栈倒是没什么...贴个代码算了.一开始有点蠢的每个位置算,后来发现出栈再算就行 ...
- luogu P1044 火车进出栈问题(Catalan数)
Catalan数就是魔法 火车进出栈问题即: 一个栈(无穷大)的进栈序列为 1,2,3,4,...,n 求有多少个不同的出栈序列? 将问题进行抽象, 假设'+'代表进栈, 则有'-'代表出栈 那么如果 ...
- 问题-栈S最多能容纳4个元素,现有6个元素按A、B、C、D、E、F顺序进栈,问可能的出栈顺序。
住栈的特性:对于取出栈内元素每次只能从栈顶开始取(后进先出(栈满时,只能先出后进)) 由于栈内只能容纳4个元素: 所以 E F不可能第一个出栈: 当栈内少于四个元素时 既可以选择进栈,也可以选择出栈 ...
- [实战演练]Intel面试题目 - 进栈出栈顺序问题
电话面试中写C++,逻辑比较清楚的一个题目,一紧张就不能好好地写下来,漏洞百出.以前经常在完善的编译环境中写代码,换了一个白板子上写反而写的不通顺了,犯了一些基础错误,比如stack中的首个元素是to ...
随机推荐
- App Store评论优化,让你的APP评论上涨
App Store评论优化怎么做 App Store评论优化,让你的APP评论上涨 关于「ASO评论优化」,主要分为三块.换评论,买评论,引导用户写评论. 可能有些刚接触ASO的朋友会问,为什么要给A ...
- kali2.0安装docker(转)
开始部署 1. Docker需要Linux Kernels 大于3.10并且是64-bit的机器,用uname -a可以查看是否符合要求. 2. 执行命令编辑文本: vim /etc/apt/sour ...
- sql的基本语句
SQL中的inner join, left join, right join, full join 创建两个测试表并且输入相关值create table test_a(aid int,aNum var ...
- EE4218 / EE4216 Faculty of Science and Engineering
Faculty of Science and EngineeringDepartment of Electronic and ComputerEngineeringEnd of Semester As ...
- python生成excel测试数据
在功能测试时,经常会测到excel文件导入导出的功能,导入与导出时,需要测试系统单次导入大批量数据时是否正常, 如果系统承受不起太大的数据导入,则需要开发限制单次导入的数量,以防止系统服务异常.大量的 ...
- instrument 之 core animation
1.Color Blended Layers 图层混合 需要消耗一定的GPU资源,避免设置alpha小于1,省去不必要的运算 2.Color Hits Green and Misses Red 光栅化 ...
- 关于 RESTful API 中 HTTP 状态码的定义
最近正好使用了一会儿 Koa ,在这说一下自己对各个 请求码的见解和使用场景,懒人直接看 200.400.401.403.404.500 就可以了. 其中 2XX/3XX 其实都是请求成功,但是结果不 ...
- fastJson解析报错:com.alibaba.fastjson.JSONException: can't create non-static inner class instance.
原因: 如果出现类嵌套类的情况,需要将被嵌套的那个类设置为static. 比如: public class AA { // 相关属性 public class BB {//会报错 // 相关属性 } ...
- [PCL]模型拟合方法——随机采样一致性
SACSegmentation封装了多种Ransac方法,包括: RandomSampleConsensus, LeastMedianSquares, MEstimatorSampleConsensu ...
- 【Idea】-NO.162.Idea.1 -【Idea Unable to import maven project: See logs for details】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...