关于求最长递增子序列会超时的问题(使用栈)

类似于uva10524的题目。
uva10534的题目大意是给出一串数字,最多有10000个,问这串数字里面可以组成的前n个数字递增和后n个数字递减的最长序列是多少。

如果直接用求最长递增子序列的方法的话,有两层for肯定是会超时的。

那么可以使用堆栈的方式,用栈保存数字。
如果遇到第一个数字或者遇到比当前的栈顶数字更大的数字的话那么就将其存入栈顶中。
如果遇到的数字不比栈顶大的话,那么就找栈中刚好大于它的数字,现在的数字的最长递增子序列的长度和刚好大于它的数字的最长递增子序列的长度是一样的。然后替换刚好大于它的数字。
为什么要替换呢?注意,这个地方不是插入而是替换。(不可以插入,因为最长递增子序列是有顺序要求的)
因为你替换了刚好比它大的数字,那么就加强了最长递增子序列的潜能,因为我们在求最长递增子序列的时候当然是希望相邻两个数字挨得越近越好。例如 1 3 5 6 4 2 3 设cnt为最长递增子序列的长度
加入栈的顺序是
1 cnt = 1
3 cnt = 2
5 cnt = 3
6 cnt = 4
4 替换5 cnt = 3(1,3,4) 栈中有 1 3 4 6
2 替换3 cnt = 2(1,2)栈中有1 2 4 6
3 替换4 cnt = 3(1,2,3) 栈中有1 2 3 6
如果上面没有替换的话,那么此时3最长的子序列只有2

代码:

#include &
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值