動態規劃 LIS

2021-07-07 10:22:50 字數 549 閱讀 7506

最長遞增子串行(lis)的問題是要找到乙個給定序列的最長子序列的長度,使得子串行中的所有元素被排序的順序增加。

例如, lis的長度是6和 lis為。

最優子結構:

對於長度為n的陣列a[n] = ,假設假設我們想求以aj結尾的最大遞增子串行長度,設為l[j],那麼l[j] = max(l[i]) + 1, where i < j && a[i] < a[j], 也就是i的範圍是0到j – 1。這樣,想求aj結尾的最大遞增子串行的長度,我們就需要遍歷j之前的所有位置i(0到j-1),找出a[i] < a[j],計算這些i中,能產生最大l[i]的i,之後就可以求出l[j]。之後我對每乙個a[n]中的元素都計算以他們各自結尾的最大遞增子串行的長度,這些長度的最大值,就是我們要求的問題——陣列a的最大遞增子串行。

int lis(int a,int

length)

}int longestdistance = distance[0];

for(int i=1;ireturn

0;}

動態規劃 LIS

動態規劃是比較重要的演算法啦,打算慢慢寫幾篇部落格總結一下。動態規劃的基本思想是 要求原問題的解,先求出更小一些的問題的解,由子問題的解通過某種方式得到原問題的解。以上是有關動態規劃的一些基本概念和概括。第一篇就先講一下最長遞增子串行 lis 的問題的解決。給出乙個數列a,求a的乙個 長度最大的子數...

動態規劃 LIS

lis指乙個序列中最長的單調遞增 嚴格 的子串行。有一種較為樸素的o n 2 的做法,我們不多做贅述,我們講一種用單帶棧和二分來實現的o logn 的演算法 我們從1 n列舉,若該數比棧頂元素大,那麼我們就將該數壓入棧中。否則我們就在整個棧中二分到乙個第乙個大於等於它的數,將其用a i 替換。考慮為...

動態規劃 LIS問題

最長上公升子串行 longest increasing subsquence 即lis問題是動態規劃解決的乙個經典問題。例如輸入序列1 5 2 3 4 輸出最長上公升子串行的長度 4 子串行為1 2 3 4 動態規劃思路 dp i 為最長子序列最後乙個元素為元序列第i個元素是的最大長度,只要把前面比...