最長上升子序列

最長上升子序列問題:

給出一個由n個數組成的序列x[1..n],找出它的最長單調上升子序列。即求最大的m和a1,
a2……,am,使得a1<a2<……<am且x[a1]<x[a2]<……<x[am]。

動態規劃求解思路分析:(O(n^2))

經典的O(n^2)的動態規劃算法,設A[i]表示序列中的第i個數,F[i]表示從1到i這一段中以i結尾的最長上升子序列的長度,初始時設F[i] = 0(i = 1, 2, ..., len(A))。則有動態規劃方程:F[i] = max{1, F[j] + 1} (j = 1, 2, ..., i - 1, 且A[j] < A[i])。

貪心+二分查找:(O(nlogn))   
開闢一個棧,每次取棧頂元素s和讀到的元素a做比較,如果a>s,  則加入棧;如果a<s,則二分查找棧中的比a大的第1個數,並替換。  最後序列長度爲棧的長度。  
這也是很好理解的,對x和y,如果x<y且E[y]<E[x],用E[x]替換  E[y],此時的最長序列長度沒有改變但序列Q的''潛力''增大。  
舉例:原序列爲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。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章