傳送門
在n
nn個數中分出若干個區間使得區間的價值總和最大
在新加入乙個數時,我們能夠產生影響的範圍是最近乙個比自己小的那個數,所以我們用乙個單調棧來維護每個數的那個數
設f
if_i
fi表示做到i
ii時最優解,加入乙個數時,我們有兩種選擇,乙個是自己將比自己大的數都合併在一起,整個區間的答案就是自己,另一種則是選擇默默無名,乖乖的加入乙個有比自己小的區間內
對於第乙個選擇,我們如何確定最優解時到底是如何安排區間的呢
我們之前的f
ff都已經確定了,因為f
ff儲存的就是i
ii之前的最優安排方案,所以我們取max
max\
max,而在這個最優安排下可能會存在沒有被放入其他區間的數,那就跟當前這個數一起作為乙個新區間,然後價值就帶入到公式裡計算就好了
因為我們覆蓋過的數是已經確定的,從而每個數都只會被覆蓋一次,這樣就是o(n
)o(n)
o(n)
的優秀複雜度
#include
#include
#include
#include
#include
#include
#include
#include
#define lzx mu
#define ll long long
using namespace std;
inline ll read()
while
(s>=
'0'&&s<=
'9')
return d*f;
}ll n,a,b,c,d;
ll get
(ll x)
struct nodes[
200005];
ll x[
200005
],len=
0,f[
200005];
intmain()
cout<;return0;
}
滑動最小值
時間限制 1 sec 記憶體限制 128 mb 提交 127 解決 27 提交 狀態 討論版 命題人 admin 題目描述 給定乙個長度為 n 的數列 a0,a1,an 1和乙個整數k。求數列 bi min ai,ai 1 ai k 1 i 0,n 特別的,對於 i n k 的 bi 0。輸入第一行...
最大最小值
示例一 maximum lambda x,y x y x x y y 注意 x y 返回的是0或者1 minimum lambda x,y x y y x y x a 10 b 20 print the largar one is d maximum a,b print the lower one ...
最大值 最小值
求最大最小的時候有點小技巧,就是我們兩個兩個的比較,把大個跟當前最大比較,小的跟當前最小的比較,這樣就會節約一點比較時間,有原來的2 n到3 n 2。include include 得到最大最小值 int getmaxmin int ndata,int nlen,int pnmax,int pnmi...