最長上升子序列問題:
給出一個由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。