單調佇列優化動態規劃

2022-05-10 23:26:39 字數 1874 閱讀 2550

lj: 那些又遠又差的,我們就不要了

[luogup1725 琪露諾](在幻想鄉,琪露諾是以笨蛋聞名的冰之妖精。

某一天,琪露諾又在玩速凍青蛙,就是用冰把青蛙瞬間凍起來。但是這只青蛙比以往的要聰明許多,在琪露諾來之前就已經跑到了河的對岸。於是琪露諾決定到河岸去追青蛙。

小河可以看作一列格仔依次編號為0到n,琪露諾只能從編號小的格仔移動到編號大的格仔。而且琪露諾按照一種特殊的方式進行移動,當她在格仔i時,她只移動到區間[i+l,i+r]中的任意一格。你問為什麼她這麼移動,這還不簡單,因為她是笨蛋啊。

每乙個格仔都有乙個冰凍指數a[i],編號為0的格仔冰凍指數為0。當琪露諾停留在那一格時就可以得到那一格的冰凍指數a[i]。琪露諾希望能夠在到達對岸時,獲取最大的冰凍指數,這樣她才能狠狠地教訓那只青蛙。

但是由於她實在是太笨了,所以她決定拜託你幫它決定怎樣前進。

開始時,琪露諾在編號0的格仔上,只要她下一步的位置編號大於n就算到達對岸。

對於60%的資料:n <= 10,000

對於100%的資料:n <= 200,000

對於所有資料 -1,000 <= a[i] <= 1,000且1 <= l <= r <= n

可以想到dp,$ \ f[i] \ $表示走到第 $ \ i \ $格的最大冰凍值

轉移:$ \ f[i] \ = \ max( \ f[i - j] \ + \ a[i] \ ) \ (l \le j \le r) \ \ , f[0] \ = \ a[0] $

時間複雜度$ \ o(n^2) \ $

考慮轉移方程$ \ f[i] \ = \ max( \ f[i - j] \ ) \ (l \le j \le r) $

即$ \ f[i] \ 只與 \ f[i - j] \ (l \le j \le r) \ $有關

考慮將所有的\(f[i - j]\)裝入佇列,並維護其單調性

即將所有不可能成為最優答案的元素彈出

再將所有的已經超出當前範圍的元素彈出,就成功維護了

可知這是個雙端佇列(deque)

code:

#include using namespace std;

const int n = 200005;

int n, l, r, a[n], f[n * 2], ans = -999999999;

template inline void read(t &t)

while(ch >= '0' && ch <= '9')

t *= m;

}struct node ;

deque que;

int main(void)

int p = 0;

for(int i = l; i <= n; i++) );

while(que.front().idx < i - r) que.pop_front();

f[i] = que.front().val + a[i];

p++;

}for(int i = n - r; i <= n; i++)

printf("%d\n", ans);

return 0;}/*

/*58 3 22

0 480 333 559 795 -357 -331 29 -719 -527 621 954 -87 -350 -242 -391 -991 -626 -367 285 490 -62 366 251 282 446 597 -640 -115 357 -60 157 -380 -544 669 792 -250 -40 -989 860 780 578 30 224 116 -987 219 431 629 -266 -188 -478 322 699 907 -108 -373 -575 -107

*/

動態規劃之單調佇列優化

先上一道單調佇列動態規劃的模板題 這道題很明顯是一道dp題,可以通過兩個for迴圈就能得到結果,但是n,l,r太大了,兩層for迴圈就超時了,所以我們得用單調佇列來優化。動態規劃一般類如 dp i min dp j f j 0 j i 因為j是從0開始的,使用我們可以用乙個變數記錄dp j f j ...

動態規劃中的單調佇列優化

最近經常出現單調佇列,斜率優化的題目。看到周圍的大神們都會做了,我只能跟上去。要慢慢來,先學單調佇列。類似這樣的轉移方程可以用到單調佇列 f i m ax g j w i 其中,g j 是乙個與i無關係的數。w i 只與i有關係。我們首先開乙個佇列。dp時 1 先刪掉前面超出範圍的隊頭。2 利用隊頭...

hdu 3401 單調佇列優化動態規劃

思路 動態方程很容易想到dp i j max dp i j dp i w 1 j k k ap i dp i w 1 j k k bp i dp i j 表示第i天擁有j個石頭的最大價值。其實每次求得都是最有策略,所有dp i w 1 表示的就是i w 1以前的最優,故不同往前遍歷。那麼主要需要優化...