[递归与递推] 栈与卡特兰数

news2025/1/12 0:58:48

题目背景

栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。

栈有两种最重要的操作,即 pop(从栈顶弹出一个元素)和 push(将一个元素进栈)。

栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。

题目描述

宁宁考虑的是这样一个问题:一个操作数序列,1,2,…,n(图示为 1 到 3 的情况),栈 A 的深度大于 n。

现在可以进行两种操作,

  1. 将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 push 操作)
  2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 pop 操作)

使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 1 2 3 生成序列 2 3 1 的过程。

(原始状态如上图所示)

你的程序将对给定的 nn,计算并输出由操作数序列 1,2,…,n 经过操作可能得到的输出序列的总数。

输入格式

输入文件只含一个整数 n(1≤n≤18)。

输出格式

输出文件只有一行,即可能输出序列的总数目。

输入输出样例

输入 #1

3

输出 #1

5
解题分析

先考虑一下本题的数量级,n<=18,我们知道,一个元素可以往往可以有三种操作,进栈,出栈,或者不出栈,等下一个元素进来出栈后再出栈。那么,如果我们去枚举的话,将要面对的是2^18甚至更高的枚举次数,这显然会导致超时。加上题目并未要求我们把每一个序列都输出,所以虽然题目有栈的背景,但是我们并不需要去使用这个数据结构。

考虑动态规划或者递推的做法,我们先来介绍一下动态规划的做法。我们可以这样去考虑一个函数f(i,j),i代表在栈内的元素个数,j代表还未进栈的元素个数。先来考虑一些边界的特殊情况,当i为0时,可以自然地想到,我们这个时候只有一种操作,让栈外第一个元素进栈,于是有f(i,j)=f(i+1,j-1);当j为0时,也就是元素都在栈内了,那没什么好说的,只能让元素出栈了,而且后续都是不停地让元素出栈,这个时候只有一种做法,固f(i,j)=1;接下来就是一个比较复杂的情况了,当栈内和栈外都有元素的时候,i>0,j>0,又该如何去考虑呢?这个时候我们考虑栈内的元素,它是可以出栈的,所以有一种情况是f(i-1,j),考虑栈外的元素,它是可以进栈的,所以又有一种情况是f(i+1,j-1),这个时候f(i,j)=f(i-1,j)+f(i+1,j-1),至此,我们已经讨论完全部情况了,配合记忆化搜索的方法,本题很容易就解决了。

代码实现1
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int dp[20][20];
int f(int i,int j){
	if(dp[i][j]) return dp[i][j];
	if(i==0){
		return dp[i+1][j-1]=f(i+1,j-1);
	}
	if(j==0){
		return 1;
	}
	return dp[i][j]=f(i+1,j-1)+f(i-1,j);
}

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

接下来我们分析一下递推的方法,这就涉及到一个特殊的数,卡特兰数。

大致是这么个意思,我们假定dp[i]为i个数依次进栈,随机出栈所能得到的序列个数,那么,我们很容易得到dp[0]=dp[1]=1; 接下来,我们考虑n个数,n>1的情况。

假定数x是最后一个出栈的元素,这是可以实现的,每个元素x我们都可以让比它小的数进栈后全出光再让它进栈,然后把它赖在栈底不走,出光比它大的数。那么,我们很容易就可以知道,当我们进行分类讨论时,我们可以以某个元素最后出栈为我们讨论的标准,那么,一共有x=1,2,3....n,共n种情况,其中当取定x时候,有x-1个数比x小,n-x个数比x大,根据组合数乘法原理,我们可以得到在这种情况下的方法数是f[x-1]*f[n-x]。

也就是说f[n]=f[0]*f[n-1]+f[1]*f[n-2]......f[n-1]*f[0]。

代码实现
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int f[20]={0};

int main(){
	f[0]=f[1]=1;
	int n; cin>>n;
	for(int i=2;i<=n;i++)
		for(int j=0;j<=i-1;j++){
			f[i]+=f[j]*f[i-j-1];
		}
	cout<<f[n]<<endl;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1480510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一“类“:深入理解Qt的心脏《QObject》

Qt框架以其强大的跨平台能力和丰富的用户界面元素而广受开发者欢迎&#xff0c;而QObject类无疑是Qt框架心脏的所在。本文将深入探讨QObject&#xff0c;揭示其提供的核心功能以及如何在Qt项目中有效利用这个基类。 核心功能 信号与槽 Qt独特的信号与槽机制是其事件通信的基…

【Rust】——结构体struct

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

vue系列——vscode,node.js vue开发环境搭建

第一步安装node.js 推荐使用nvm进行node.js 的安装 nvm(Node.js version manager) 是一个命令行应用&#xff0c;可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 可以去网上查找相关版本 我这里使用 nvm-setu… 链接:https://pan.baidu.com/s/1UEUtmzw5x…

spring事务方法调用不生效的场景

同一个类中&#xff0c;事务方法调用非事务方法时&#xff0c;事务是可以生效的。反例事务不生效见以下 4. 同一个类中&#xff0c;方法内部调用 Autowired private XXXMapper xxxMapper; Autowired private YYYMapper yyyMapper; Transactional public ResultVO<AssetCh…

pag动效预览

潮玩apk里面分析静态资源发现动效有lottie 和pag文件 PAG官网 | PAG动效PAG动效组件可以降低或消除动效相关的研发成本&#xff0c;接入SDK后&#xff0c;设计师可通过PAGExpoter、PAGViewer等工具&#xff0c;一键将设计师在 AE 中制作的动效内容导出成素材文件&#xff0c;并…

【QT 5 +Linux下软件qt软件打包+qt生成软件创建可以安装压缩包+学习他人文章+第三篇:学习打包】

【QT 5 Linux下软件qt软件打包qt生成软件创建可以安装压缩包学习他人文章第三篇&#xff1a;学习打包】 1、前言2、实验环境3、自我学习总结-本篇总结&#xff08;1&#xff09;了解安装包的目录结构&#xff08;2&#xff09;了解要编写文件与编写脚本1. control文件2. postin…

vue3+vite 项目的创建

这里要提醒一下&#xff0c;如果我们要使用 vue3 的组合式api 的写法的话&#xff0c; 那么我们使用的 vue 版本不能低于 vue3.2 版本&#xff0c;不能低于 vue3.2 版本&#xff0c;不能低于 vue3.2 版本 vue2 已停止维护了&#xff0c; 现在全面拥抱vue3 之前用 vue-cli 创建…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:图片边框设置)

设置容器组件的图片边框样式。 说明&#xff1a; 从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 borderImage borderImage(value: BorderImageOption) 设置组件的图片边框。 卡片能力&#xff1a; 从API version 9开始…

2.2_4 调度算法的评价指标

文章目录 2.2_4 调度算法的评价指标&#xff08;一&#xff09;CPU利用率&#xff08;二&#xff09;系统吞吐量&#xff08;三&#xff09;周转时间&#xff08;四&#xff09;等待时间&#xff08;五&#xff09;响应时间 总结 2.2_4 调度算法的评价指标 注&#xff1a;要理解…

CentOs的yum报错: except KeyboardInterrupt, e:

1.报错 File “/bin/yum”, line 30 except KeyboardInterrupt, e: ^^^^^^^^^^^^^^^^^^^^ 2.原因&#xff1a;yum需要用python2编译&#xff0c;如果服务器安装的是python3.6并作为默认编译器的话&#xff0c;就会出现这个错误。 3.解决方法&#xff1a;whereis python 4.修改y…

【EI会议征稿通知】第三届新能源、储能与电力工程国际学术会议(NESP 2024)

第三届新能源、储能与电力工程国际学术会议&#xff08;NESP 2024&#xff09; 2024 3rd International Conference on New Energy, Energy Storage and Power Engineering (NESP 2024) 近几十年来&#xff0c;全球能源消耗迅速增加&#xff0c;因此寻找和开发性能优良的环保…

如何根据我的世界/Minecraft玩家数量选择合适的服务器配置,包括内存和CPU核心数的实际案例分析?

根据Minecraft玩家数量选择合适的服务器配置&#xff0c;首先需要考虑的是服务器的处理能力&#xff0c;这主要由CPU和内存决定。对于Minecraft服务器来说&#xff0c;CPU核心数直接影响到服务器能够同时处理的任务数量&#xff0c;而内存容量则决定了服务器能承载的人数。 对…

P1160 队列安排题解

题目 一个学校里老师要将班上N个同学排成一列&#xff0c;同学被编号为1∼N&#xff0c;他采取如下的方法&#xff1a; 先将1号同学安排进队列&#xff0c;这时队列中只有他一个人&#xff1b; 2∼N号同学依次入列&#xff0c;编号为i的同学入列方式为&#xff1a;老师指定编…

我写了个ImageWindow应用

文章目录 0 引言1 应用简介2 主要功能和特点2.1 多图像同/异步像素级对比2.2 支持多达30种图像格式2.3 高效率的图像处理性能 3 简明使用教程3.1 软件下载安装与更新3.1.1 软件下载与安装3.1.2 软件更新 3.2 多视窗添加并自动最优排列3.3 多样化图像导入方式3.4 自动切换显示模…

如何实现WordPress后台显示文章、分类目录、标签等的ID?

我们平时在使用WordPress的过程中&#xff0c;偶尔需要用到文章的ID&#xff0c;或分类目录ID&#xff0c;或标签ID&#xff0c;或媒体库ID&#xff0c;或评论ID&#xff0c;或用户ID等&#xff0c;但是WordPress后台默认是不显示它们的ID的。 今天boke112百科就跟大家分享如何…

Linux 下安装Jupyter

pip3 install jupyter pip3 install ipython -------------------------------------------- pip3 install jupyterlab jupyter lab pip3 list | grep jupyterlab 启动&#xff1a; python3 -m jupyter lab 2.安装朱皮特 pip3 install -i https://pypi.douban.com/simpl…

力扣1107 每日新用户统计

力扣SQL查询案例——在过去90天内&#xff0c;每个日期首次登录的用户数 目录 题目描述 解题思路 完整代码 题目描述 Traffic 表&#xff1a; ------------------------ | Column Name | Type | ------------------------ | user_id | int | | activity …

计算机二级MySQL-错题、知识点合集04

计算机二级MySQL 第四章 索引 主键约束&#xff0c;不允许为空也不允许重复。 NOT NULL非空约束属于自定义完整约束 PRIMARY KEY 属于实体完整性约束 FOREIGN KEY外键约束 外键与其引用的主键应分别属于不同的表&#xff0c;可以属于同一个关系&#xff1b;一个关系中可以定…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

css5定位

css 一.定位1.概念&#xff08;定位定位模式边位移&#xff09;2.静态位移static&#xff08;不常用&#xff09;3.相对定位relative&#xff08;不脱标&#xff09;&#xff08;占位置&#xff09;4.绝对定位absolute&#xff08;脱标&#xff09;&#xff08;不占位置&#x…