进出栈序列问题详解

链接:https://ac.nowcoder.com/acm/contest/1005/B

题目描述

一列火车n节车厢,依次编号为1,2,3,…,n。每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种。

输入描述:

一个数,n(n≤60000)n (n \leq 60000)n(n≤60000)

输出描述:

一个数s表示n节车厢出栈的可能排列方式

示例1

输入

3

输出

5

示例2

输入

50

输出

1978261657756160653623774456

思路:

方案一:暴力枚举

对于栈问题,简单来想只有进栈和出栈的操作

所以直观的来看,直接暴力枚举每个节点情况

{1.2.

利用递归快速实现,时间复杂度 :O(2N)

在这个时间复杂度下很容易TLE

方案二:递推优化 O(N2)

因为本题只是要求求出有多少种出栈序列并不关心具体方案,于是我们可以使用递推直接进行统计。设SN 表示进栈顺序为 1234...,N 时可能的出栈序列总数。

现在假设序列中位置 K 的地方有一个数 aa前面有K1个数要出栈,a后面有NK个数要出栈,而出栈的方案总数分别是 SK1SNK 于是这个大问题就转化成了小问题,我们就要求更小的 Si,于是有递推公式(很好理解):

image-20200809143436205
image-20200809143436205

方案三:动态规划 O(N2)

动态规划。这里我们要有状态与决策的思想(这个真的很重要,有时与搜索也异曲同工)。我们设 F[i,j] 是还有 $i j$ 个元素在栈中的方案总数,初始状态是F[0,0]=1,目标状态是F[N,0]F,每一次我们的决策有“让一个数进栈”,“让栈顶的数出栈”,所以方程有:

F[i,j]=F[i1,j+1]+F[i,j1]

方案四:数学 O(N)

该问题等价于求第 NCtalan数,即 C2NN/(N+1)

posted @   RioTian  阅读(737)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
点击右上角即可分享
微信分享提示