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