AcWing1087 修剪草坪 單調佇列DP

2021-10-07 07:33:25 字數 1482 閱讀 6295

題目傳送門

在一年前贏得了小鎮的最佳草坪比賽後,fj 變得很懶,再也沒有修剪過草坪。

現在,新一輪的最佳草坪比賽又開始了,fj 希望能夠再次奪冠。

然而,fj 的草坪非常髒亂,因此,fj 只能夠讓他的奶牛來完成這項工作。

fj 有 n 只排成一排的奶牛,編號為 1 到 n。

每只奶牛的效率是不同的,奶牛 i 的效率為 ei。

編號相鄰的奶牛們很熟悉,如果 fj 安排超過 k 只編號連續的奶牛,那麼這些奶牛就會罷工去開派對。

因此,現在 fj 需要你的幫助,找到最合理的安排方案並計算 fj 可以得到的最大效率。

注意,方案需滿足不能包含超過 k 只編號連續的奶牛。

輸入格式

第一行:空格隔開的兩個整數 n 和 k;

第二到 n+1 行:第 i+1 行有乙個整數 ei。

輸出格式

共一行,包含乙個數值,表示 fj 可以得到的最大的效率值。

資料範圍

1≤n≤105

0≤ei≤109

輸入樣例:

5 212

345

輸出樣例:
樣例解釋

fj 有 5 只奶牛,效率分別為 1、2、3、4、5。

fj 希望選取的奶牛效率總和最大,但是他不能選取超過 2 只連續的奶牛。

因此可以選擇第三隻以外的其他奶牛,總的效率為 1 + 2 + 4 + 5 = 12。

題解:f[i]表示前 i 個人合法情況下的最高效率, s[i]為字首和

則對於f[i]:

1.不選第 i 個人, f[i] = f[i - 1]

2.選第 i 個人, 設在 i 前面選了 x 個人, 則f[i] = max(f[i - x - 1] + s[i] - s[i - x]) = max(f[i - x - 1] - s[i - x]) + s[i];

3.由於資料範圍很大, 所以我們可以用單調佇列來維護f[i - x - 1] - s[i - x]的最大值,

#include

using namespace std;

typedef

long

long ll;

const

int n =

1e5+10;

int n, m;

ll f[n]

;ll sum[n]

;int st[n]

;int

main()

int l =

0, r =0;

for(

int i =

1; i <= n; i++

) cout << f[n]

<< endl;

return0;

}

AcWing 1087 修剪草坪

link 雙倍經驗 三倍經驗 陣列沒開夠,爆零兩行淚 longlong開成int,爆零兩行淚 多組忘清空,爆零兩行淚 dp 沒初值,爆零兩行淚 深搜沒邊界,爆零兩行淚 廣搜忘出隊,爆零兩行淚 輸入沒加 爆零兩行淚 模數沒看見,爆零兩行淚 1 不輸出,爆零兩行淚 越界不特判,爆零兩行淚 線段樹開一倍,...

2202 修剪草坪

在一年前贏得了小鎮的最佳草坪比賽後,約翰變得懶惰了,再也沒有修剪過草坪。現在,新一輪的比賽又開始了,約翰希望能夠再次奪冠。然而,約翰家的草坪非常髒亂,因此,約翰需要讓他的奶牛來完成這項工作。約翰家有n頭奶牛,排成一直線,編號為1到n。每只奶牛的能力是不同的,第i頭奶牛的能力為ei。靠在一起的奶牛很熟...

小學期 修剪草坪

有乙個n m的草坪 1 n,m 100 草坪中的草原來的高度都是100。現在使用割草機修剪草坪,來得到各種各樣的圖案。割草機只 能橫著或者豎著割草。每次割草都會先設定乙個高度,割完之後會把比設定高度高的草都割成設定的高度。比如草原來是5 2 8,設定高度為4,那麼割完之後就變成了4 2 4。現在給出...