[刷题之旅no5][NOIP2003 普及组] 栈

由于这是一个抽象的栈,所以实际上根本用不到栈来处理这个问题
将这个问题抽象化:
对于每个数字,只有push和pop两种操作
而对于整个栈的输出,只需要2n次操作
当栈不空且队列不空
此时可以push和pop
而当栈空时
只可以pop
而当push等于n时
相当于把整个队列按照一定顺序push到栈里面去了,pop出来也不会改变顺序,我们此时结束
所以可以定义一个stack函数
有两个参数,一个push次数,一个pop次数
当push=n说明结束
push=pop说明栈空
构造一个递归函数就行了
可是这样出现了TLE的问题,所以还要想办法提升函数的效率
查看题解:记忆化搜索
//记忆化搜索较难理解,于是我使用了递推式
用f[push,pop]来记录:在一定的push和pop次数下,对应的可能情况。而最终我需要的结果就是f[n,n]
对于递推,需要两点:
1.初始条件
2.递推公式
初始条件就是f[i,0]也就是push i次,pop0次的情况都是1
而递推公式需要分情况来看。
基本要求:
push>=pop
1.push==pop时
说明此时为空,因此只可以通过pop得到
2.push>pop
无所谓,都可以得到。
然后通过递推就可以得到想要的结果了。
小发现:
f[n,0]+f[n,1]+…+f[n,n]=f[n+1,n+1];一点小失误而发现的意外收获。
记忆话搜索还是难以理解,我先放着算是一个遗憾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值