烽火传递
#include<bits/stdc++.h>
#define maxn 200005
using namespace std;
int a[maxn],dp[maxn],n,m,ans=0x3f3f3f3f;
deque<int> dq;
int main(){
cin>>n>>m;
dq.push_back(0);
for(int i=1;i<=n;i++){
cin>>a[i];
while(dq.size()&&i-dq.front()>m) dq.pop_front();
dp[i]=dp[dq.front()]+a[i];
while(dq.size()&&dp[dq.back()]>dp[i]) dq.pop_back();
dq.push_back(i);
if(i>=n-m+1) ans=min(dp[i],ans);
}
cout<<ans;
return 0;
}
修剪草坪
#include<bits/stdc++.h>
using namespace std;
long long n,m,e[100005];
long long dp[100005],s;
long long ans=1e18;
deque<int> dq;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>e[i];
s+=e[i];
}
dq.push_back(0);
for(int i=1;i<=n;i++){
while(dq.size()&&i-dq.front()>m+1) dq.pop_front();
dp[i]=dp[dq.front()]+e[i];
while(dq.size()&&dp[i]<dp[dq.back()]) dq.pop_back();
dq.push_back(i);
if(i>n-m-1) ans=min(ans,dp[i]);
}
cout<<s-ans;
return 0;
}