洛谷P1725琪露諾 單調佇列優化dp

2022-04-06 02:31:43 字數 1228 閱讀 1369

在幻想鄉,琪露諾是以笨蛋聞名的冰之妖精。某一天,琪露諾又在玩速凍青蛙,就是用冰把青蛙瞬間凍起來。但是這只青蛙比以往的要聰明許多,在琪露諾來之前就已經跑到了河的對岸。於是琪露諾決定到河岸去追青蛙。小河可以看作一列格仔依次編號為0到n,琪露諾只能從編號小的格仔移動到編號大的格仔。而且琪露諾按照一種特殊的方式進行移動,當她在格仔i時,她只會移動到i+l到i+r中的一格。你問為什麼她這麼移動,這還不簡單,因為她是笨蛋啊。每乙個格仔都有乙個冰凍指數a[i],編號為0的格仔冰凍指數為0。當琪露諾停留在那一格時就可以得到那一格的冰凍指數a[i]。琪露諾希望能夠在到達對岸時,獲取最大的冰凍指數,這樣她才能狠狠地教訓那只青蛙。但是由於她實在是太笨了,所以她決定拜託你幫它決定怎樣前進。開始時,琪露諾在編號0的格仔上,只要她下一步的位置編號大於n就算到達對岸。

輸入格式:

第1行:3個正整數n, l, r

第2行:n+1個整數,第i個數表示編號為i-1的格仔的冰凍指數a[i-1]

輸出格式:

乙個整數,表示最大冰凍指數。保證不超過2^31-1

輸入樣例#1:

5 2 3

0 12 3 11 7 -2

輸出樣例#1:

11

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

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

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

/*

f[i]=max+a[i]

正好滿足單調佇列的性質,所以可以維護乙個單調遞減佇列

每到乙個格仔i先將佇列中編號小於i-r的元素出列(從隊首開始做)

然後將隊尾不大於f[i-l]的元素出列,最後將f[i-l]壓入隊尾,則f[i]=a[i]+f[隊首]

*/#include

#include

#include

#define n 200007

using

namespace

std;

intf[n],q[n],a[n];

intn,m,ans,l,r;

intmain()

ans=f[n-r+1

];

for(int i=n-r+2;i<=n;i++) ans=max(ans,f[i]);

printf(

"%d\n

",ans);

return0;

}

洛谷P1725琪露諾 單調佇列 dp

題目描述 在幻想鄉,琪露諾是以笨蛋聞名的冰之妖精。某一天,琪露諾又在玩速凍青蛙,就是用冰把青蛙瞬間凍起來。但是這只青蛙比以往的要聰明許多,在琪露諾來之前就已經跑到了河的對岸。於是琪露諾決定到河岸去追青蛙。小河可以看作一列格仔依次編號為0到n,琪露諾只能從編號小的格仔移動到編號大的格仔。而且琪露諾按照...

洛谷P1725 琪露諾(單調佇列dp)

傳送門 dp方程很簡單啊,dp i max val i 暴力找最大值只有60分,考慮優化,很明顯,用單調佇列維護乙個滑動視窗即可。起點至少是l,答案的 最多是n l。話說單調佇列寫起來好噁心啊。每次都寫不對。還是要多練看來 include define n 200005 using namespac...

洛谷P1725 琪露諾

在幻想鄉,琪露諾是以笨蛋聞名的冰之妖精。某一天,琪露諾又在玩速凍青蛙,就是用冰把青蛙瞬間凍起來。但是這只青蛙比以往的要聰明許多,在琪露諾來之前就已經跑到了河的對岸。於是琪露諾決定到河岸去追青蛙。小河可以看作一列格仔依次編號為0到n,琪露諾只能從編號小的格仔移動到編號大的格仔。而且琪露諾按照一種特殊的...