該演算法主要運用了貪心和二分的思想。
其中的sum陣列的作用:sum[i]表示長度為i的最長上公升子串行末尾元素的最小值。
#include
using namespace std;
const
int maxn=
1e5+10;
int s[maxn]
,sum[maxn]
;int n;
intmain()
int len=
0;sum[len]
=s[0];
for(
int i=
1;icout<1<}return0;
}
同理可知最長的不降子串行的o(n*logn)的演算法的**:
#include #include #include #include #include #include #include using namespace std;
const int maxn = 1e5+5;
const int inf = 0x3f3f3f3f;
typedef long long ll;
int s[maxn],sum[maxn];
int n;
int main()
}cout<}
return 0;
}
最長上公升子串行 O nlogn
題目描述 input 輸入乙個整數n 表示接下來有 n 個數輸入。output 輸出當前數列最長上公升子串行的長度。直接上 最長下降子串行 最長山峰序列都可以以該問題為母問題 進行延伸。include include using namespace std define max 1000 int s...
最長上公升子串行O nlogn
假設已經計算出的兩個狀態a和b滿足a a a b 且d a d b 則對於後續所有的狀態i 即i a且i b 來說,a並不會比b差 如果b滿足a b a i 的條件,a肯定也滿足,且二者的d值相同 但反過來卻不一定了,a滿足a a a i 的條件時,b卻不一定滿足。換句話說,如果我們只保留a,一定不...
最長上公升子串行O nlogn
令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 結尾的新的最長上公升子串行。對於所有的 0 j i 1,我們需要找出其中的最大值。dp狀態轉移方程 d i m...