类似于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 &