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...