昨天要写一道最长上升子序列的题,想起了自己曾经写过一篇,翻出来看了一下,只有一个感觉 ~~~ 满眼都是水
这篇算是上一篇的完善和追加.
最长上升子序列 -----最长不下降子序列
最长不上升子序列 ---- 最长下降子序列
最长上升子序列 和 最长不下降子序列
最长上升子序列的核心思想就是 追加 和 替换
有一个数组 a[],我们要在 a[] 中找到一个最长上升子序.
首先我们需要维护一个数组 lis ,这个数组用来保存 a[] 中的最长上升子序.
然后需要判断 a[] 中的每一个元素.
如果 a [ ] a[] a[] 中的元素 a [ i ] a[i] a[i] 大于当前 l i s lis lis 的最后一个元素 l i s [ c n t ] lis[cnt] lis[cnt],就将该元素追加在 l i s [ ] lis[] lis[] 后面,
否则就在 l i s lis lis 中找第一个大于等于 a [ i ] a[i] a[i] 的元素进行替换.
举个例子:
a [ ] = 2 , 1 , 3 , 5 , 6 , 4 a[] = {2,1,3,5,6,4} a[]=2,1,3,5,6,4;
l i s [ ] = 2 lis[] = {2} lis[]=2;
l i s [ 0 ] = a [ 0 ] lis[0] = a[0] lis[0]=a[0]
从第二个元素进行判断
当 i = 1 i = 1 i=1 时 -> l i s [ ] = 1 lis[] = 1 lis[]=1
当 i = 2 i = 2 i=2 时 -> l i s [ ] = 1 , 3 lis[] = 1,3 lis[]=1,3
当 i = 3 i = 3 i=3 时 -> l i s [ ] = 1 , 3 , 5 lis[] = 1,3,5 lis[]