P1044 [NOIP2003 普及组] 栈 C语言

news/2025/2/5 14:04:24 标签: 数据结构, 开发语言, c++, 算法

P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态

题目背景

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

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

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

宁宁考虑的是这样一个问题:一个操作数序列,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输出 #1
35
说明/提示

【题目来源】

NOIP 2003 普及组第三题

思路:

动态方程先写一下 

            if(i >= 1)//栈内有东西,可以出栈操作  和 进栈操作 
            dp[i][j] = dp[i-1][j] + dp[i+1][j-1];  
            if(i == 0)//进栈操作 
            dp[i][j] = dp[i+1][j-1]; 

用dp既可以做出来,思路过程先说说。f[i][j],i作为栈内元素个数,j为队列元素个数。有些人可能会觉得,为什么啊?状态方程为什么可以这样列呢?所以我们需要进行模拟队列1 2 3的过程,发现一点规律,这里我就不多说了。最终可以发现这两个条件的确可以确定组成序列的方案数。注意:f[i][0]都设置为1作为边界,是因为序列已经形成了,在搜索写法表示返回1.总之就是找到这个方案了返回1.dp也一样.
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
int n;
int dp[20][20];//i表示栈内个数,j表示队列个数 ,那么方案数就是f[0][n] 
int main() 
{ 
  	cin >> n;
  	for(int i = 0 ; i <= n ; i++)
  	dp[i][0] = 1;//因为队列为0说明序列已经形成了,可以返回1了。 
  	for(int j = 1 ; j <= n ; j++)
  	{
  		for(int i = 0 ; i <= n ; i++)
		{
			if(i >= 1)//栈内有东西,可以出栈操作  和 进栈操作 
			dp[i][j] = dp[i-1][j] + dp[i+1][j-1];  
			if(i == 0)//进栈操作 
			dp[i][j] = dp[i+1][j-1]; 	
		}	
	}
	cout << dp[0][n];
    return 0;
}

http://www.niftyadmin.cn/n/5842253.html

相关文章

物联网领域的MQTT协议,优势和应用场景

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为轻量级发布/订阅协议&#xff0c;凭借其低带宽消耗、低功耗与高扩展性&#xff0c;已成为物联网通信的事实标准。其核心优势包括&#xff1a;基于TCP/IP的异步通信机制、支持QoS&#xff08;服务质量&…

LeetCode --- 434周赛

目录 3432. 统计元素和差值为偶数的分区方案 3433. 统计用户被提及情况 3434. 子数组操作后的最大频率 3435. 最短公共超序列的字母出现频率 一、统计元素和差值为偶数的分区方案 本题可以直接模拟&#xff0c;当然我们也可以来从数学的角度来分析一下这题的本质 设 S S S …

站在JavaScript的视角去看,HTML的DOM和GLTF的Json数据。

很多前端小伙伴没有见过、操作过gltf文件&#xff0c;对非常懵逼&#xff0c;本文从前端小伙伴最熟悉的dom模型为切入口&#xff0c;以类别的方式来学习一下gltf文件。 一、结构与组织形式 HTML DOM&#xff08;文档对象模型&#xff09;&#xff1a; 树形结构&#xff1a;HT…

结合 vim-plug 安装并使用 Gruvbox 主题教程

前置工作&#xff1a;vim-plug的安装 vim-plug的自动安装与基本使用介绍-CSDN博客 安装 Gruvbox 在 .vimrc 的plug列表中添加以下代码 call plug#begin()Plug morhetz/gruvboxcall plug#end()在vim中使用命令 :PlugInstall 配置 Gruvbox 官方文档 Configuration morhetz/…

FreeRTOS学习 --- 消息队列

队列简介 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制&#xff08;消息传递&#xff09; 全局变量的弊端&#xff1a;数据无保护&#xff0c;导致数据不安全&#xff0c;当多个任务同时对该变量操作时&#xff0c;数据易受损 使用队列的情况如下&#xff1a;…

Scala语言的安全开发

Scala语言的安全开发 引言 在现代软件开发中&#xff0c;安全性是一个不可忽视的重要因素。特别是在处理敏感数据和用户信息时&#xff0c;确保代码的安全性尤为重要。Scala语言以其强大的功能和灵活性&#xff0c;在大数据处理和并发编程中受到了广泛的关注与应用。然而&…

连续的最长序列(哈希)

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解…

MyBatis-Plus速成指南:简化你的数据库操作流程

简介&#xff1a; MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatsi-Plus 提供了通用的 Mapper 和 Service&#xff0c;可以不编写任何 SQL 语句的前提下&#xff0c;快速的实现单表的增…