最長上公升子串行的長度(LIS)

2021-09-24 02:57:33 字數 692 閱讀 8830

o(nlogn)做法:貪心+二分        (該想法是在o(n^2)的動態規劃中進一步演化而來)

p[i]表示第i個元素,

dp[i]表示長度為i+1的lis結尾元素的最小值

利用貪心的思想,對於乙個上公升子串行,最後面的乙個元素越小,越有利於新增新的元素,這樣lis長度更長,

所以我們要維護dp陣列,其表示的就是長度為i+1的lis結尾元素的最小值,保證每一位都是最小值,

這樣dp陣列的長度就是lis的長度,即答案。

給定陣列,求最長上公升子串行的長度,

(1)dp=p=1,長度為1的lis,就為第乙個數

(2)dp=p=7,因為p>dp,直接新增到dp尾

(3)dp=p=3,因為p>dp,所以在lis中找第乙個大於p的元素,並將其替換為p

(4)dp=p=5,因為p>dp,直接新增到dp尾

dp陣列維護完畢後,dp陣列的長度就是lis長度==3

在上面第2部中查詢第乙個大於key的數,採用二分查詢更省時

#includeusing namespace std;

const int maxn=50004;

int p[maxn];

int dp[maxn];

int main()

else

}cout

}

最長上公升子串行 LIS 長度

屬於簡單的經典的dp,求最長上公升子串行 lis 先研究了o n 2 的思路。令a i 表示輸入第i個元素,d i 表示從a 1 到a i 中以a i 結尾的最長子序列長度。對於任意的0 j i 1,如果a j a i 則a i 可以接在a j 後面形成乙個以a i 結尾的新的最長上公升子串行。對於...

最長上公升子串行 LIS的長度

首先要知道什麼是子串行?它和子串的區別 子串是指字串中連續的n個字元。子串行是指字串中不一定連續但先後順序不變的n個字元。對於乙個給定的陣列,它的最長上公升子串行不一定唯一,但是最長上公升子串行的長度一定是確定的。這裡我給出兩種方法分別是dpo n2 的和貪心 二分的演算法。1 動態規劃dp。我們可...

最長上公升子串行 LIS

題目 兩道題幾乎一樣,只不過對於輸入輸出的要求有所不同罷了。lis有兩種方法 一 第一種方法 時間複雜度為o n 2 狀態 dp i 區間為0 i的序列的lis 轉移方程 dp i max 1,dp k 1 0 k include include include include using name...