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 ...
随机推荐
- C# Asp.net中简单操作MongoDB数据库(一)
需要引用MongoDB.Driver.dll.MongoDB.Driver.core.dll.MongoDB.Bson.dll三个dll. 1.数据库连接: public class MongoDb ...
- what's the 白盒测试
what's the 白盒测试 白盒测试又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试.盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的.白盒要考虑测试 ...
- 【tomcat启动失败问题】Unable to start embedded Tomcat
启动spring boot 项目后抛出如下异常: org.springframework.context.ApplicationContextException: Unable to start em ...
- GIT回滚master分支到指定tag版本
master版本上线以后一般要打一个tag备份,以防事态有变,这是一个好习惯,如果以后有问题也可以放心的回滚版本,那么怎么用tag版本覆盖mastaer呢,其实只有几个命令 1.查看分支 git br ...
- office word memo
显示左侧目录树 office 和 wps 的差异 wps 的版本:视窗 ->文档结构图 office 的版本: 视图 ->导航窗格
- .Net Core部署IIS
1.环境安装 https://dotnet.microsoft.com/download/dotnet-core 下载Runtime & Hosting Bundle包安装,iis模块会出现支 ...
- PHP 类的命名空间 和自动载入
PHP 类的自动载入有两种方法,__autoload() 和 spl_autoload_register() ,就是在PHP代码中new一个类的时候,会自动触发,将类的类名包括命名空间作为参数传进入方 ...
- nist-sha
nist目前支持的sha运算,sha1系列,输出mac160bit. sha2系列,支持sha2-224,sha2-256,sha2-384,sha2-512,sha2-512/224,sha2-51 ...
- jquery autocomplete 设置滚动条
加入样式 .ui-autocomplete{height:250px; overflow-y: scroll; overflow-x: hidden;}
- linux 基本原则和常用命令
Linux的基本原则:1.由目的单一的小程序组成,组合小程序完成复杂的功能:2.一切皆文件:3.尽量避免捕获用户接口:4.配置文件保存为纯文本格式. CLI接口的命令提示符:#(root)$(普通用户 ...