20pts求助,stl单调队列

P2627 [USACO11OPEN] Mowing the Lawn G

一个句号 @ 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]和等于条件的处理出了问题,这里不是很透彻,但是查不太出来


|