C++知识点总结(24):栈的真题

概览

  • P1044 ★★★☆☆ [NOIP2003 普及组] 栈
    • 1. 审题
      • 题目背景
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例1
    • 2. 思路
    • 3. 参考答案
      • 3.1 卡特兰公式
      • 3.2 前缀和

P1044 ★★★☆☆ [NOIP2003 普及组] 栈

1. 审题

题目背景

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

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

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

题目描述


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

现在可以进行两种操作,

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

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

(原始状态如上图所示)

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

输入格式

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

输出格式

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

样例1

输入

3

输出

5

2. 思路

题目要求计算给定操作数序列 1 , 2 , … , n 1, 2, \ldots, n 1,2,,n 的所有可能输出序列的总数。

dp[i] 表示操作数序列长度为 i 时的可能输出序列的总数。根据递推关系可得:

d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] + d p [ i − 3 ] + . . . + d p [ 1 ] dp[i] = dp[i-1] + dp[i-2] + dp[i-3] + ... + dp[1] dp[i]=dp[i1]+dp[i2]+dp[i3]+...+dp[1]

这样,就是考到前缀和了。

穿插:
【不知道前缀和怎么写?看这个教程:
https://blog.csdn.net/joe_g12345/article/details/135035825】

其中,dp[i-1] 表示在操作数序列长度为 i-1 的情况下,通过 push 得到的可能输出序列的总数;dp[i-2] 表示在操作数序列长度为 i-2 的情况下,通过 pushpop 得到的可能输出序列的总数;以此类推。

当然我们也可以直接用卡特兰公式(不过考试的时候那么紧张,应该想不到,呵呵)。

3. 参考答案

3.1 卡特兰公式

#include <iostream>
using namespace std;int n;
long long f[25];int main()
{f[1] = 1;cin >> n;for (int i = 2; i <= n; i++){// 卡特兰公式f[i] = f[i - 1] * (4 * i - 2) / (i + 1);}cout << f[n] << endl;return 0;
}

3.2 前缀和

#include <iostream>
using namespace std;int n;
long long dp[25];int main()
{cin >> n;dp[1] = 1; // 空栈也算一种序列for (int i = 2; i <= n; i++){for (int j = 1; j <= i; j++){dp[i] += dp[j]; // push操作}}cout << dp[n] << endl;return 0;
}

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

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

相关文章

算法:数据结构顺序表表的插入、删除和查找

#include <iostream> #include <stdio.h> #define MaxSize 50 typedef int ElemType; typedef struct {ElemType data[MaxSize];int length; }SqList; bool ListInsert(SqList &L,int i,ElemType e)//插入数据 {if(i<1 || i>L.length1)//判断插入的位置是…

自动化运维利器Ansible基础(环境部署)

Ansible 介绍及安装 1. 介绍 Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编 排更复杂的 IT 任务&#xff0c;如连续部署或零停机时间滚动更新。 Ansible ⽤ Python 编写&#xff0c;尽管市⾯上已经有很多可供选择的 配置管理解决⽅案&#xff08;例如 Salt、Pupp…

Aigtek高压功率放大器设计参数有哪些

高压功率放大器是一种用于放大高频信号的电子设备&#xff0c;广泛应用于通信、雷达、无线电等领域。它能够将输入信号的幅度放大到较高的水平&#xff0c;以便传输或驱动其他设备。 在设计高压功率放大器时&#xff0c;需要考虑以下几个重要参数&#xff1a; 频率范围&#xf…

代码随想录 二叉树—二叉树的层序遍历Ⅱ

思路&#xff1a;就是在上一个题的基础上将result最后翻转了一下&#xff0c;这样就可以实现自下而上的层序遍历。 知识点&#xff1a;stack和queue&#xff0c;也就是栈和队列&#xff0c;是push&#xff1b; 栈stack&#xff1a;push()&#xff0c;pop()&#xff0c;top()&a…

ELK 安装部署

文章目录 1.日志收集规划2.Elasticsearch部署2.1.Elasticsearch安装2.2.Elasticsearch-head安装2.3.Elasticsearch设置分片数2.4.elasticsearch健康检查 3.Kibana部署4.Logstash部署5.Filebeat部署 开源中间件 # Elastic Stackhttps://iothub.org.cn/docs/middleware/ https:/…

工会排队模式:引领创新消费体验的新潮流

在互联网和电子商务的浪潮下&#xff0c;消费者的购物需求与期待正在持续升级。为了迎合这一趋势&#xff0c;工会排队模式应运而生&#xff0c;以其独特的消费体验方式引领市场潮流。 工会排队模式打破了传统电商的桎梏&#xff0c;通过现金返还机制为购物赋予了新的定义。这一…

vue中表单数据规则验证

1、使用:rules属性&#xff0c;如后h5代码 <template> <div class"dialog-box"> <el-scrollbar> <el-form ref"service" :model"serviceForm" :rules"rules" label-width"100px" > <el-row styl…

【微服务】SpringBoot整合Resilience4j使用详解

目录 一、前言 二、熔断器出现背景 2.1 几个核心概念 2.1.1 熔断 2.1.2 限流 2.1.3 降级 2.2 为什么会出现熔断器 2.3 断路器介绍 2.3.1 断路器原理 三、Resilience4j介绍 3.1 Resilience4j概述 3.1.1 Resilience4j是什么 3.1.2 Resilience4j功能特性 3.2 Resilie…

Windows系统安装OpenSSH结合VS Code远程ssh连接Ubuntu【内网穿透】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-mEkKUraSFHLKkzIj {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

nacos配置更新错误并不会导致已经启动的服务宕机

nacos配置更新错误并不会导致已经启动的服务宕机 但是可能会导致异常

QML GridView 网格视图

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 和 ListView 一样,GridView 也是基于 Flickable 的视图组件,它们的用法非常相似。不同的是,ListView 中的元素被存储在线性链表中,并以单列(或单行)的形式进行展示的,因此适用于垂直(或水平)列表的…

生成哈夫曼树(100%用例)C卷(JavaPythonC++Node.jsC语言)

给定长度为n的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 为了保证输出的二又树中序遍历结果统一,增加以下限制:二叉树节点中,左节点权值小于等于右…

使用Visual Studio创建跨平台CMake项目

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 创建跨平台项目的意义是什么&#xff1f; 跨平台CMake项目的意义在于提供一种统一的构建系统&#xff0c;使得开发者可以编写一份…

第十三届蓝桥杯省赛C++ C组《全题目+题解》

填空题一般都是找规律题目&#xff0c;耐下心来慢慢分析即可。 第一题《排列字母》 【问题描述】 小蓝要把一个字符串中的字母按其在字母表中的顺序排列。 例如&#xff0c;LANQIAO 排列后为AAILNOQ。 又如&#xff0c;GOODGOODSTUDYDAYDAYUP 排列后为AADDDDDGGOOOOPSTUUYYY。…

CommandInvokationFailure: Failed to update Android SDK package list. 报错的解决方法

将Unity升级到2021.3.36f1&#xff0c; 再次打开项目&#xff0c;结果出现“CommandInvokationFailure: Failed to update Android SDK package list. ”这样的警告&#xff0c;查看SDK版本最高只有到30&#xff0c;这应该就是Unity自动升级SDK的时候出现了错误&#xff0c;导致…

简单易集成的实名认证实名认证接口-C#语言实名认证接口免费教程

现如今&#xff0c;随着网络安全法等相关法规的实施&#xff0c;线上互联网平台与服务提供商都要求用户进行实名认证&#xff0c;以提高账户安全、防止欺诈行为和保障交易的合法性。翔云实名认证接口&#xff0c;通过核验身份证二要素、三要素、三要素现场人像的方式助力线上平…

十五、软考-系统架构设计师笔记-面向服务架构设计理论与实践

1、SOA相关概念 面向服务的架构(SOA)的定义 SOA 是一个组件模型&#xff0c;它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的&#xff0c;它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构…

技术驱动校园招聘:Java+SpringBoot+Vue的实践之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Vue3】学习命名路由和嵌套路由

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

湘菜馆如何选择合适的油烟净化器?打造清新餐饮厨房

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 湘菜馆是传统的中国美食代表之一&#xff0c;然而烹饪湘菜的同时&#xff0c;油烟也是无法避免的问题。为了打造一个清新的餐…