【第22期】观点:IT 行业加班,到底有没有价值?

最长上升子序列的O(nlgn)解法

原创 2013年12月03日 19:17:23

感觉网上说的太复杂了……

今天我突然想明白了,写起来不过三行代码而已。

 

首先换一种状态表示:设f[i]为长度为i的上升子序列中末尾元素的最小值,
初始化f[0]=INT_MIN,f[1~N]=INT_MAX
然后对于每个元素,更新集合 { f[i] | f[i-1]<a[j] } 中的所有f[i]的最小值,
以上方法O(n^2)


由于f[i-1]<a[j](上面集合中的条件),
所以用于更新的a[j]一定比更新上一位置的那玩意大,所以f数组单调递增,
前面比a[j]小的更新不走,只有更新中间那个位置的,
或者说对于一个a[j],只可能更新一个,就是上一个还小的,下一个就比它大的那个,

用二分优化更新过程~~O(nlgn)

实现比O(n^2)的方法还简单!只需要三行代码!~~~~~~~~
fill(f,f+n,INT_MAX);
for(int i=0;i<n;++i)
    *lower_bound(f,f+n,a[i])=a[i];

版权声明:本文为本人原创,允许转载,但转载请注明出处:http://blog.csdn.net/kingpharaoh 举报

相关文章推荐

uva10534 - Wavio Sequence O(nlgn)的最长上升子序列

以前也遇到过用正常方法O(n^2)超时的的情况,然后就听说有O(nlgn)的方法,查了一下觉得好麻烦就没看。。果然今天又遇见了超时=。= 没办法了 就看了一下这个算法。交了之后3s超时变成了0.172...

编程之美2.16 数组中最长递增子序列的长度 O(nlgn)

题目:        设L=&lt;a1,a2,…,an&gt;是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=&lt;aK1,ak2,…,akm&gt;,其中k1&lt;k2&lt;…&lt;km且aK1&lt;ak2&lt;…&lt;akm。求最大的m值。     在下面的代码中 lis[i]表示以array[i]结尾的递增子序列的最大长度, max[j]表示长度为j的递增

欢迎关注CSDN程序人生公众号

关注程序员生活,汇聚开发轶事。

最长上升子序列问题的几种解法

拿POJ 2533来说。 Sample Input 71 7 3 5 9 4 8 Sample Output 4 从输入的序列中找出最长的上升子序列(LIS)。 这题一看,是一道典型的DP问题(就是动态规划),可以用dfs,深度优先遍历来解,如下代码: #include&lt;iostream&gt;#include

LIS 最长上升子序列问题 nlgn时间打印其中一个序列

什么是最长上升子序列?从字面意思就很好理解,就是从一系列顺序输入中,寻找一个上升子序列,要求这个子序列的长度最长。对O(n^2)的解法(DP)这里不讨论了,主要说一下nlgn的解法。网上查了一下,都是...

最长上升子序列问题的几种解法

拿POJ 2533来说。 <p style="margin-top: 0px; margin
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)