題目描述
在一年前贏得了小鎮的最佳草坪比賽後,約翰變得懶惰了,再也沒有修剪過草坪。現在,新一輪的比賽又開始了,約翰希望能夠再次奪冠。然而,約翰家的草坪非常髒亂,因此,約翰需要讓他的奶牛來完成這項工作。約翰家有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...