3. 栈-递推与递归(普及-)

2023-11-13

问题描述

请添加图片描述
宁宁考虑了这样一个问题:一个操作数序列1,2,…,n(图示为 1 到 3 的情况),栈 A 的深度大于n。
现在可以进行两种操作,
1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作)
2.将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作)
使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 1 2 3 生成序列 2 3 1 的过程。
请添加图片描述
(原始状态如上图所示)
你的程序将对给定的n,计算并输出由操作数序列1,2,…,n 经过操作可能得到的输出序列的总数。

输入格式
输入文件只含一个整数n(1≤n≤18)。
输出格式
输出文件只有一行,即可能输出序列的总数目。

输入输出样例

输入 #1

3

输出 #1

5

问题分析

  本问题涉及到了卡特兰算法,但是也有其他的方法能够解决该问题,这里我使用的是dfs法(dfs大法好)。题目的意思是给出一个队列,问这个队列进栈再出栈有多少种不同的排列顺序,这里我们可以设一个二维数组f[x][y],x代表队列中的元素个数,y代表栈中的元素个数,每次递归可以做两件事:

  1. 将队列中的一个元素进行入栈操作,即f[x-1][y+1]操作
  2. 将栈里的一个元素进行出栈操作,即f[x][y-1]操作

  其中递归的截至条件即为x为0时,即队列中的元素全部都入栈为止,此时return 1;表示只有这一种方法了。同时也要注意操作2有一个限制条件,即y>0才能进行该操作。至此一个dfs的代码就完成啦。
&emps;&emps;但是这样的程序交上去会出现超时的现象,所以需要优化,这里我们可以使用记忆化的方式,即对于已经算好的情况,直接带值运算,无需再算一遍,大大的降低了程序的时间复杂度。最后代码也是成功AC。

代码实现

#include <iostream>
using namespace std;

int f[20][20];													//x表示队列里数的个数,y表示栈里数的个数

int dfs(int x, int y);

int main()
{
	int n;
	cin >> n;
	cout << dfs(n, 0) << endl;
	return 0;
}

int dfs(int x, int y)
{
	if (f[x][y] != 0)											//记忆化,如果已经算过这种情况,直接带值计算
		return f[x][y];
	if (x == 0)													//队列里的数全部入栈,情况唯一
		return 1;
	if (y > 0)													//注意条件
		f[x][y] += dfs(x, y - 1);								//两件事
	f[x][y] += dfs(x - 1, y + 1);
	return f[x][y];
}

运行结果

请添加图片描述

总结

  本题主要考察卡特兰算法,这里使用了深度搜索来解决问题,代码简洁明了清晰,所以说dfs大法还是好东西,之后要多加练习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3. 栈-递推与递归(普及-) 的相关文章

随机推荐

  • Android Studio 4.x 返回上一次编辑的地方

    Android Studio 升级到 4 x 后 返回上一次编辑的地方的快捷键变成了 Alt Shift 左箭头 了
  • JUC之ReentrantReadWriteLock

    JUC之ReentrantReadWriteLock 1 背景 由于ReentrantLock是独占可重入锁 因此在进行操作的时候 不能够满足多线程同时操作数据 为了满足并发场景下的临界资源的数据共享 出现了ReentrantReadWri
  • web上传图片到七牛云服务器

    本文通过java web的使用 把要上传的图片通过浏览器上传到服务器上面 文本仅供参考 可能出现很多不合理 1 创建对应的jsp页面 下面是jsp下面的对应的from表单 上传文件用的那么ImgFiles的属性名称 同样你可以使用其他的 或
  • 零基础开发NBIOT

    前言 shineblink core 开发板 简称Core 的库函数支持NBIOT通信功能 所以只用几行代码即可实现基于M5311 NB模块的联网通信 TCP UDP MQTT 功能 这里我们主要介绍通过TCP实现联网通信的功能 更多关于T
  • KVM MMU EPT内存管理

    转载请注明 转载自博客xelatex KVM 并附本文链接 谢谢 注 文章中采用的版本 Linux 3 11 https www kernel org pub linux kernel v3 x linux 3 11 tar gz qemu
  • 信息学奥赛C++语言: 螺旋方阵1

    题目描述 一个 n 行 n 列的螺旋方阵按如下方法生成 从方阵的左上角 第 1 行第 1 列 出发 初始时向右移动 如果前方是未曾经过的格子 则继续前进 否则 右转 重复上述操作直至经过方阵中所有格子 根据经过顺序 在格子中依次填入 1 2
  • 【学习笔记】性能测试——Jmenter的使用入门(自用)

    一 性能理论 性能测试理论 什么是性能测试 初始 服务器崩溃 宕机 客户机性能 概念 利用脚本或者工具对于被测系统进行一定的负载测试 观察性能指标是否满足用户需求 得到相关性能指标 并优化 性能测试的目的 不是完全为了找bug 是为了验证系
  • vue gyp错误

    gyp verb ensuring that file exists C Python27 python exe gyp ERR configure error gyp ERR stack Error Can t find Python e
  • POJ 2966 k-d Tree

    题意 二维平面中有n个点 求每个点和其他点的最远距离 include
  • 语义分割之FCN训练预测自己的数据集

    之前博客PyQt5实现深度学习平台Demo 八 c 调用python方式完成训练和预测 jiugeshao的专栏 CSDN博客中提到 接下来主精力还是先放在深度学习分类 检测 分割算法上面 之前虽然也对各算法做过了解 但没有一一用代码实现过
  • CUDA之窄带常规波束形成

    思路 现在手上有了cuda的复数矩阵乘法和复数矩阵转置 理论上讲可以做一个简单的波束形成了 按照matlab之并行计算 的思想把for循环都变成矩阵来做 复数矩阵定义 typedef struct int width int height
  • flutter是什么

    Flutter是Google开源的构建用户界面 UI 工具包 帮助开发者通过一套代码库高效构建多平台精美应用 支持移动 Web 桌面和嵌入式平台 Flutter 开源 免费 拥有宽松的开源协议 适合商业项目 截止2022年5月12日Flut
  • 回溯算法之最大团问题

    以下内容摘自 http wenku baidu com view 356779bdf121dd36a32d8243 html 本人第一篇博文 经验严重不足 尚未完成 先做做测试 大家多多包涵 回溯法的思想 穷举 暴力搜索整个解空间 找出所有
  • Unity IAP的使用

    http blog sina com cn s blog 94dfd97d0102wwap html 按照这个哥们的教程顺利完成内购 记下一些坑点 1 使用UnityIAP需要将应用先发布至Google 获取应用公钥 在服务和IPA中 2
  • 给程序员推荐的一款机械键盘

    一 Keychron品牌简介 Keychron是一个网红机械键盘 可以同时兼容多款操作系统 是众多科技博主推荐产品 Keychron是机械键盘网红品牌 因在油管上被无数码博主使用而爆红 国内的版本是京东京造K系列键盘 价格要比国外官网便宜
  • 深度学习算法发展:从多样到统一

    OpenAI在GPT 3模型基础上引入了人类反馈强化学习方法 RLHF 训练出InstructGPT模型 并据此发布了对话机器人ChatGPT 引起了互联网用户的注意 深度学习算法发展 从多样到统一 up pdf https url39 c
  • openwrt的路由器重置root密码

    家里路由器刷了openwrt 结果长期没登录 忘了root密码 很容易就找到了这里介绍的办法 http www openwrt org cn bbs thread 12327 1 1 html 但在我这里不行 那个recvudp exe一直
  • 《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.25.14集群(多主多从)》

    一 架构图 如下图所示 二 环境信息 1 资源下载 基于containerd部署容器版kubernetes1 25 14集群资源合集 2 部署规划 主机名 K8S版本 系统版本 内核版本 IP地址 备注 k8s master 12 1 25
  • MySQL索引面试题面经汇总

    一 索引 1 MySQL如何实现的索引 三种 B 树索引 主要 重点 hash索引 配合b 树索引使用 没法手动创建 全文索引 对于整个数据做全文的摘要索引 2 innodb和Myisam索引的区别 innodb索引本身就在数据中 也就是说
  • 3. 栈-递推与递归(普及-)

    文章目录 问题描述 问题分析 代码实现 运行结果 总结 问题描述 宁宁考虑了这样一个问题 一个操作数序列1 2 n 图示为 1 到 3 的情况 栈 A 的深度大于n 现在可以进行两种操作 1 将一个数 从操作数序列的头端移到栈的头端 对应数