码迷,mamicode.com
首页 > 其他好文 > 详细

最长上升子序列

时间:2016-04-30 23:33:52      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

对于一个数列a1,a2,a3,a4……求取其最长的子序列s1,s2,s3……使其满足单调递增的算法,叫做最长上升子序列

 

对于该问题有两种思路:

  • 动态规划方法求解 O(n2)
  • 贪心+二分 O(nlogn)

 

动态规划

A[i]表示序列中的第i个数

dp[i]表示从1到i这一段中以i结尾的最长上升子序列的长度

初始时设dp[i] = 0(i = 1, 2, ...)。

则有动态规划方程:dp[i] = max{1, dp[j] + 1} (j = 1, 2, ..., i - 1, 且A[j] < A[i])

 

贪心+二分

构造一个有顺序的栈s

每次取栈顶元素top和读取到的元素a

if top<a

  s.push(a)

else

  用a替换栈中第一个比a大的数

 

最后栈中的元素的数量就是所求的数量(但是栈中元素可能并不是最长上升子序列)


举例:原序列为1,5,8,3,6,7  
栈为1,5,8,此时读到3,则用3替换5,得到栈中元素为1,3,8,  再读6,用6替换8,得到1,3,6,再读7,得到最终栈为1,3,6,7  ,最长递增子序列为长度4。 

 

栈的维护用数组模拟链表应该更方便

最长上升子序列

标签:

原文地址:http://www.cnblogs.com/ohyee/p/5449629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!