JZOJ 6305 最小值 思維 dp

2021-09-26 06:35:07 字數 1070 閱讀 8645

傳送門

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