LIS優化 佇列優化 二分

2021-08-30 02:39:22 字數 1237 閱讀 8023

mbp送去維修的第5天。

給定一長度為n的數列,請在不改變原數列順序的前提下,從中隨機的取出一定數量的整數,並使這些整數構成單調上公升序列。 輸出這類單調上公升序列的最大長度。資料範圍:1 ≤ n ≤ 100000

輸入包括兩行,第一行為n,代表數列的長度。第二行為n個整數。

輸出這類單調上公升序列的最大長度

5

3 1 5 4 6

3
資料規模為106

,10^6,

106,

o (n

2)

o(n^2)

o(n2

)的演算法一定是不行的。

重新寫一下o(n^2)的方法:

#include

#include

#include

#include

using namespace std;

const

int maxn =

1e6+5;

int a[maxn]

,dp[maxn]

;// int front[maxn];//front記結點前驅

int n,ans;

intmain()

ans=

max(ans,dp[i]);

} cout

//int k=0;

//for(int i=1;i<=n;i++)

// if(dp[i] == maxn)

// k=i;

//while(k!=-1)

////return0;

}

o(n log n)的方法:

類似於bfs的佇列實現 ,

在佇列中存在1,2,6三個數,下乙個是5時,可以直接用5替代6

#include

#include

#include

#include

using namespace std;

int n,a[

100010];

int s[

100010

],tot;

int tmp;

intmain()

}printf

("%d\n"

,tot)

;return0;

}

LIS 最長上公升子串行 (二分優化)

題目 長度為n的序列a1,a2,an,選出滿足 j i 時,a j a i 最長子序列 分析 當選擇第i個時候,在j狀態 dp i 表示以i為終點的最大上公升序列 轉移方程 dp i max include include include include include include includ...

LIS 最長上公升序列(DP 二分優化)

求乙個數列的最長上公升序列 動態規劃法 o n 2 1 dp 2int lis int a,intn 3 16 17 18return cnt 1 因為初始化為0,所以返回結果 1 19 貪心 二分法 o nlogn 分析 要讓乙個序列具有最長上公升子串行,其實就是保證子串行中的每個元素盡可能小,降...

LIS 最長上公升子串行 dp 二分優化

建立乙個陣列res maxn res i 用來記錄以i位置為結尾的最長的子串行,那麼我們要求res這個陣列裡的最大值 注意不是res n 所以當我們在求res i 時,需要從0到i 1掃一遍,看看通過哪個點 鬆弛 因為這個演算法好像迪科斯徹最短路,所以借用這個名詞來解釋一下 這樣 如下 includ...