最長上公升子串行 二分做法

2021-09-26 05:22:42 字數 891 閱讀 1994

給定乙個長度為n的數列,求數值嚴格單調遞增的子串行的長度最長是多少。

輸入格式

第一行包含整數n。

第二行包含n個整數,表示完整序列。

輸出格式

輸出乙個整數,表示最大長度。

資料範圍

1≤n≤10001≤n≤1000,

−109≤數列中的數≤109−109≤數列中的數≤109

輸入樣例:

7

3 1 2 1 8 5 6

輸出樣例:

4
二分做出的答案只有數量是最長上公升子串行的長度,並沒有儲存他這個方案。 二分的做法就是通過二分查詢維護乙個單調遞增的序列。 

首先建立乙個儲存最大上公升子串行的陣列q然後遍歷要求的序列,如果說當前這個數比q的尾數還要大的話那麼肯定就能構成乙個更長的上公升子串行,如果小的話那麼就找出第乙個大於他的數(前面也說了並沒有儲存他的方案只是找出數量)把他替換掉,如果還有比隊尾大的數要入隊的話改變前面的位置對後面是沒有影響的,而如果有比隊尾小的話向前找也可以做到讓這個"新"數列盡可能地長(如果這個新的能覆蓋原來的序列的話那麼最長的就是這個新的,否則就還是原來的那個)這個就相當於在乙個陣列裡存了好多有可能成為最長上公升子串行的字串然後不斷擴充套件他們的可能。很神奇

#include #include #include #include #include #include typedef  long long ll;

using namespace std;

int n,m;

int a[10010],dp[510][510];

vectorq;

int main()

q[l]=a[i];}}

cout<}

二分求最長上公升子串行

我們知道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,然後還用到了貪心,怎麼貪,就是保證原序列長度不變的情況下,讓裡面的元素盡可能小 當然滿足遞增 下面來驗證為什麼...

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

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