DP 單調佇列優化 修剪草坪

2021-09-28 20:20:40 字數 2051 閱讀 4721

題目描述

在一年前贏得了小鎮的最佳草坪比賽後,約翰變得懶惰了,再也沒有修剪過草坪。現在,新一輪的比賽又開始了,約翰希望能夠再次奪冠。然而,約翰家的草坪非常髒亂,因此,約翰需要讓他的奶牛來完成這項工作。約翰家有n頭奶牛,排成一直線,編號為1到n。每只奶牛的能力是不同的,第i頭奶牛的能力為ei。靠在一起的奶牛很熟悉,所以如果安排相鄰的k+1頭奶牛一起工作,她們就會密謀罷工,所以不能選中連續的k+1頭奶牛。因此,約翰需要你的幫助。如何挑選奶牛,才能使她們的能力之和最高呢?

輸入第一行:兩個用空格隔開的整數:n

nn和k

kk,1≤n

≤100000,1

≤k≤n

1≤ n≤ 100000,1≤ k≤ n

1≤n≤10

0000

,1≤k

≤n第二行到n+1

n+1n+

1行:第i+1

i+1i+

1行有乙個整數,表示第i頭牛的能力ei,

1≤ei

<=1

09

ei,1≤ ei <= 10^9

ei,1≤e

i<=1

09輸出第一行:單個整數,表示最大的能力之和

樣例輸入

5 2123

45樣例輸出

資料範圍限制

對於30% 的資料,有1≤n

≤10

1 ≤ n ≤ 10

1≤n≤10

。對於60% 的資料,有1≤n

≤2

,000

1 ≤ n ≤ 2, 000

1≤n≤2,

000。

對於100% 的資料,有1≤n

≤100

,000

1 ≤ n≤ 100, 000

1≤n≤10

0,00

0。提示除了第三頭以外的所有奶牛都選,總能力為1+2

+4+5

=12

1+2+4+5=12

1+2+4+

5=12

思路很(不)顯然,這是一道dpdp

dp(!!!)

設 f

if_i

fi​ 是到第i頭牛的最優解

那麼,從第i−k

i-ki−

k頭牛到第i頭牛肯定有一頭牛j

jj不能選 (好慘一牛的),j就是這k+1

k+1k+

1頭牛的斷點

如果用字首優化一下,那麼就是

我們小小的變形一下

發現max裡面的值只與j有關,所以可以用單調佇列優化轉移。

雷鋒幫助

(作為乙個蒟蒻,)我相信我以後肯定看不懂單調佇列優化,然後還要回來搜自己寫的單調佇列優化,so,我來給未來的自己舉個栗子。。。

單調佇列就是單調遞增或者單調遞減

有四頭牛,他們分別是老大、老

二、老三、老四。選牛時,前三個選了,到老四了。嗯~ ta比老三小(選的晚),但是ta比老三巨,所以,老三可以退役了。誒~ 發現老四虐不過老二,那就停止虐菜。好的ヽ( ̄▽ ̄)و,再看老大,發現ta雖然比的其他幾個巨,但是ta光榮退役了(不在i-k到i的範圍內)。返回乙個最鉅的,當然是老二啦 (膜拜)。

#include

#include

using namespace std;

long long a[

100100

],f[

100100

],d[

100100

],n,k;

//d是單調佇列,f是dp,a是字首和;

int q[

100100

],h=

1,t=1;

//q是佇列,h=head,t=tail

long long demo

(int i

)int main()

for(int i=

1;i<=n;i++

) f[i]

=demo

(i)+a[i]

;printf

("%lld"

,f[n]);

}

修剪草坪 單調佇列

這道題我們可以換乙個角度思考,把題意看成 我們找到哪些奶牛不選,且滿足每兩個相鄰的不選的奶牛之間不能間隔超過k,當這些不選的奶牛的貢獻總和最低時,我們選的奶牛貢獻就最高了!這個過程用單調佇列優化一下即可,然而博主太弱了,就用了個優先佇列 include include include include...

P2627 修剪草坪 單調佇列優化dp

題目描述見鏈結 連續的工作的牛不超過 k k 個 第 i i 頭牛若工作,則左邊與其 相距最近的不工作的牛 座標範圍為 i k,i i k i 所以可以想到 dpd p,設 f i 1 0 f i 1 0 表示前 i i 頭牛,第 i i 頭牛 工作 不工作 所能得到的最大價值,狀態 轉移狀態 轉移...

loj 10177 修剪草坪 單調佇列 dp

dp i max j i k 1,i 1 列舉上一次不選的位置 那麼思路就很明確了,對於dp j sum j 1 用乙個位置遞 增,值遞減的單調佇列維護。方法二 dp i 表示不選第i個數,選出所有數的最大值。那麼sum n min dp j n j n k 就是答案。dp i min dp j n...