P1044 [NOIP 2003 普及组] 栈

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

第一次接触DP数组,完全不会做,借助此篇博客研究下洛谷用户@_std_xzh结题过程。

解题思路

定义DP状态dp_{i, j}表示当前已经有i个元素出栈,j个元素在栈中。

  1. 当初始时,只有一种情况——将元素入栈,即需要将所有的dp[0][i]初始化为1。
  2. 当栈中没有元素时(j=0时),则只能将元素入栈。入栈元素后接下来一系列步骤可能得情况数应该为当有i-1个元素出栈,还剩余1个元素出在栈中时有的情况数。则在dp[i][j]处可能出现的情况数为dp[i-1][j+1] = dp[i-1][1]
  3. 当栈中有元素时(j>0时),则既可以将元素出栈也可将元素入栈。在出栈时,若暂时将该出栈元素拿至他处(一种类似于缓冲区的地方),则此时栈的状态与出栈元素数为i,栈中元素为j-1的状态相同。在入栈时,则此时出栈的元素数量保持不变为i-1,栈中的元素数量将达到j+1个。则在dp[i][j]处可能出现的情况总数为dp[i][j-1]+dp[i-1][j+1]

学习心得

【2026.05.11】个人感觉首先需要提取出最关键的,用来构建DP数组的行列的含义。在一开始时我考虑的行是出栈后首位是0,1,2,3.......的哪一个,列是(?自己也想不清楚了)。在看了题解后我最先理解的是原文为啥使用i, j来分别做出栈数和栈中数。随后在自己梳理结题思路的过程中发现其实计算dp[i][j]时所在的状态时确实可以利用之前已经计算好的结果来构建出转移方程。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值