一个句号 @ 2023-08-30 07:34:00
#include<iostream>
#include<deque>
using namespace std;
#define ll long long
const int N=100005;
/*
dp[i]表示选i头奶牛时能获得的最大效率
在i-k到i中必定有一断点j
断开后,dp[i]=dp[j-1]+a[j+1]+a[j+2]+...+a[i]
即为dp[i]=dp[j-1]+sum[i]-sum[j];
sum[i]为定值,移动一下,选取dp[j-1]-sum[j]的最大值
dp[i]往左滑动选取最大dp[j]
别忘了初始化
*/
ll n,k,ans;//最多安排k只连续奶牛,是单调队列的窗口
ll e[N],sum[N];
ll dp[N],t[N];
deque<ll>q;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>e[i];
sum[i]=sum[i-1]+e[i];
}
q.push_back(0);
for(int i=1;i<=n;i++){
while(!q.empty()&&dp[i]>=dp[q.back()-1]-sum[q.back()]+sum[i]){
q.pop_back();
}
q.push_back(i);
while(!q.empty()&&i-k>q.front()){
q.pop_front();
}
dp[i]=dp[q.front()-1]-sum[q.front()]+sum[i];
}
cout<<dp[n];
return 0;
}
by 一个句号 @ 2023-08-30 07:35:17
我自己认为应该是对于dp[j-1]和等于条件的处理出了问题,这里不是很透彻,但是查不太出来