貪心 二分求最大上公升子串行

2021-10-01 11:22:27 字數 687 閱讀 4883

題目描述:

求最大上公升子串行,利用貪心+二分的思想,關鍵注釋都在**塊中了。

#include#include#include#includeint l, dp[100005], s[100005], len, ll, rr, mm;

int main()

len = 1;

dp[len] = s[1];

for(int i = 2;i <= l;i++)elseelse

}dp[ll] = s[i];}}

printf("%d\n",len);

}return 0;}/*

總結:1.使用乙個dp陣列,dp[i]表示長度為i的上公升子串行結尾元素的最小值,對於乙個上公升子串行,顯然其結尾元素越小,越有利於在後面接其他的元素,也就越可能變得更長。(貪心演算法思維)

2.其中使用len儲存當前能遍歷到的序列中夠組成的最長的子串行。

3.根據以上,我們只需要維護乙個dp陣列即可,對於原s[i]中的每乙個值,如果s[i]大於dp[len],那我們直接將s[i]加入dp中即可;

4.如果s[i]小於dp[len]呢?那麼就去dp陣列中找到乙個個大於s[i]的數dp[tem],並更新這個數dp[tem]為s[i],這樣做是為了向後查詢時,讓其他元素更有利於接在其後面!

5.ok,到這裡就理解到了。

*/

最長上公升子串行(貪心 二分)

最長上公升子串行的求法,除了最樸素的動態規劃外,還有利用貪心和二分法進行求解,其時間複雜度為o nlogn 低於動態規劃的時間複雜度o n2 在藍橋杯這種測試樣例巨大的競賽中,使用貪心 二分法可以有效避免超時 對於乙個數列a 我們定義乙個陣列s和陣列b,陣列b用來儲存可能的上公升序列。s i 表示長...

二分求最長上公升子串行

我們知道n2 求最長上公升子串行的方法,即 f i m ax f i f j 1 j 1i 1,f i f j 然而,我們可以用二分求最長上公升子串行。由於我們知道子串行c,c 1 c 2 c n 所以我們二分出乙個位置t,將c t 的值更新為a i 如果t ans,證明最長上公升子串行的長度可以 ...

二分求最長上公升子串行

二分求最長上公升子串行 求長度 之前在書上其實見到過,但是沒想去看,結果 回到正題,二分求最長上公升子串行的思路是,在原動態規劃寫法上進行優化,優化了查詢過程,使得查詢過程變成了lon2n,然後還用到了貪心,怎麼貪,就是保證原序列長度不變的情況下,讓裡面的元素盡可能小 當然滿足遞增 下面來驗證為什麼...