動態規劃 最長上公升子串行 LIS

2021-07-04 16:54:05 字數 1486 閱讀 6577

最長上公升子串行 簡稱lis

1.問題描述

給出乙個序列a1,a2,a3,a4,a5,a6,a7....an,求它的乙個子串行(設為s1,s2,...sn),使得這個子串行滿足這樣的性質, s1

dp[i]:以ai結尾 的最長上公升子串行

狀態轉移方程:dp[i] = max + 1

**實現o(n*(n/2))

dp[i] = max + 1

dp[1] = 1;

for(i=2; i<=n; i++)

c[0] = -1;

c[1] = a[0];

len = 1;//此時只有c[1]求出來,最長遞增子串行的長度為1.

for (i = 1; ilen)//要更新len,另外補充一點:由二分查詢可知j只可能比len大1

//更新len

} cout << len << endl;

} return 0;

}

還有一種同樣是 o(n*logn)的演算法,同樣的思想,但是不同的實現【感覺比上一種要容易理解】

姜南(slyar) 

www.slyar.com) 

這個演算法其實已經不是dp了,有點像貪心。至於複雜度降低其實是因為這個演算法裡面用到了二分搜尋。本來有n個數要處理是o(n),每次計算要查詢n次還是o(n),一共就是o(n^2);現在搜尋換成了o(logn)的二分搜尋,總的複雜度就變為o(nlogn)了。

這個演算法的具體操作如下(by ryanwang):

開乙個棧【陣列】,每次取棧頂元素top和讀到的元素temp做比較,如果temp > top 則將temp入棧;如果temp <= top則二分查詢棧中的不小於temp的第乙個數。,並用temp替換它。 最長序列長度即為棧的大小top。

這也是很好理解的,對於x和y,如果x < y且stack[y] < stack[x],用stack[x]替換stack[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。

#include #define size 1001

using namespace std;

int main()

else

else

}/* 用temp替換 */

stack[low] = temp;

} }/* 最長序列數就是棧的大小 */

cout << top << endl;

return 0;

}

----------------------------lis結束----------------------------------------

算是給自己的乙個整理。

動態規劃 最長上公升子串行(LIS)

題目 好多好多球 描述一天,jason買了許多的小球。有n個那麼多。他寫完了作業之後就對著這些球發呆,這時候鄰居家的小朋友ion回來了,jason無聊之際想到了乙個遊戲。他把這n個小球從1到n進行標號。然後打亂順序,排成一排。然後讓ion進行一種操作 每次可以任意選擇乙個球,將其放到佇列的最前端或者...

動態規劃 最長上公升子串行LIS

一.簡單推論 非0 n情況 二.嚴謹推論 最長上公升子串行 lis 給定長度為n的序列,從中選取乙個子串行,這個子串行需要單調遞增 問最長上公升子串行 lis 的長度 eg 1,5,2,3,11,7,9 則lis序列為 1,2,3,7,9,長度為5 設計狀態dp x 為以a x 結尾的lis長度,那...

動態規劃 LIS最長上公升子串行 入門

acwing 895.最長上公升子串行 這是一道典型的dp例題,dp的兩個重要元素 狀態表示和狀態計算。其中維度的選擇是很關鍵的,要求既能夠表示出轉移過程中的狀態,而且能夠計算出結果,在此基礎上,要求維度盡可能小。我們這裡可以用dp i 來表示以第i個數結尾的數值上公升的子串行的集合,屬性是max ...