最长上升子序列的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

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

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

动态规划---最长上升子序列问题(O(nlogn),O(n^2))

LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。 ****...
  • zhangyx_Xyz
  • zhangyx_Xyz
  • 2016年03月21日 20:32
  • 5548

动态规划之最长上升子序列 O(N log N)版

其实上面的方法的复杂度都达到了O(n^2)的数量级,有没有更好的解法呢? 有,用栈。 这个解法不是我想的,从网上学来的,这里面与大家分享一下。这个算法的复杂度只有O(nlogn),在有大量数据的情...
  • spirtsong
  • spirtsong
  • 2014年07月20日 21:07
  • 629

LIS(最长上升子序列)问题的三种求解方法以及一些例题

摘要本篇博客介绍了求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,后面给出了4道LIS的例题。LIS的定义一个数的序列bi,当b...
  • George__Yu
  • George__Yu
  • 2017年07月23日 11:34
  • 679

最长上升子序列的两种算法

最长上升子序列英文全称:Longest Increasing Subsequence 一.O(n*n)算法,dp[i]表示以ai为末尾的最长上升子序列的长度,而以ai结尾的最长上升子序列有两种:1...
  • qq_34681949
  • qq_34681949
  • 2016年08月11日 21:21
  • 3204

最长上升子序列的两种方法

最长上升子序列的两种方法
  • mimi9919
  • mimi9919
  • 2016年04月25日 21:56
  • 1944

最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法

为了更好的介绍O(nlogn)算法,我们回顾一下一般的O(n^2)的算法。 令A[i]表示输入第i个元素,d[i]表示从A[1]到A[i]中以A[i]结尾的最长子序列长度。对于任意的0 DP...
  • Z_zhangyinqian
  • Z_zhangyinqian
  • 2015年08月25日 17:56
  • 464

编程算法 - 最长上升子序列问题 代码(C)

最长上升子序列问题 代码(C)本文地址: http://blog.csdn.net/caroline_wendy题目: 有一个长为n的数列a. 请求出这个序列中最长上升子序列的长度. 最长上升子序列的...
  • u012515223
  • u012515223
  • 2014年07月20日 22:21
  • 1687

动态规划——最长上升子序列

最长上升子序列(Longest increasing subsequence) 问题描述         对于一串数A={a1a2a3…an},它的子序列为S={s1s2s3…sn},满足...
  • code_pang
  • code_pang
  • 2013年04月03日 20:07
  • 7239

动态规划:最长上升子序列(二分算法 nlogn)

解题心得: 1、在数据量比较大的时候n^2会明显超时,所以可以使用nlogn 的算法,此算法少了双重循环,用的lower_bound(二分法)。 2、lis中的数字并没有意义,仅仅是找到最小点li...
  • yopilipala
  • yopilipala
  • 2017年03月05日 16:13
  • 1356
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最长上升子序列的O(nlgn)解法
举报原因:
原因补充:

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