loj 10177 修剪草坪 單調佇列 dp

2021-09-27 12:03:34 字數 1632 閱讀 7949

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>=j>=n-k)+a[i];

//方法一

#include

#define ll long long

using

namespace std;

int a[

2000005];

ll sum[

2000005]=

, f[

2000005]=

;struct nodeq[

2000005];

intmain()

int l=

0, r=0;

q[0]=node

;for

(int i=

1; i<=k; i++

) q[

++r]

=node;}

for(

int i=k+

1; i<=n; i++

) f[i]

=q[l]

.w+sum[i]

;while

(f[i]

-sum[i+1]

>=q[r]

.w) q[

++r]

=node;}

printf

("%lld\n"

, f[n]);

return0;

}

//把loj#10180 烽火傳遞改一改就ac了

#include

#define ll long long

using

namespace std;

ll a[

2000005

], dp[

2000005];

struct nodeq[

2000005];

intmain()

ll l=

1, r=0;

//預處理

for(ll i=

1; i<=m; i++

) q[

++r]

=node;}

//滑動視窗

for(ll i=m+

1; i<=n; i++

) dp[i]

=q[l]

.w+a[i]

;while

(l<=r&&q[r]

.w>=dp[i]

) q[

++r]

=node;}

ll ans=

(1ll*1

<<60)

;for

(ll i=n-m+

1; i<=n; i++

)printf

("%lld\n"

, sum-ans)

;return0;

}

修剪草坪 單調佇列

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

DP 單調佇列優化 修剪草坪

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

AcWing1087 修剪草坪 單調佇列DP

題目傳送門 在一年前贏得了小鎮的最佳草坪比賽後,fj 變得很懶,再也沒有修剪過草坪。現在,新一輪的最佳草坪比賽又開始了,fj 希望能夠再次奪冠。然而,fj 的草坪非常髒亂,因此,fj 只能夠讓他的奶牛來完成這項工作。fj 有 n 只排成一排的奶牛,編號為 1 到 n。每只奶牛的效率是不同的,奶牛 i...