Monotone queue optimization dp - bzoj2442

/ * 
DP [i] [0 |. 1] represents a group selected | not selected the i-th maximum benefit obtainable cows 
dp [i] [0] = max (dp [i-1] [0], dp [i-1 ] [. 1]) 
dp [i] [1] = max (dp [x] [ 0] + SUM [I] -sum [X]) 
was converted to dp [i] [1] = max (dp [x] [ 0] -sum [x]) + sum [it] 
    then dp [x] [0] -sum [x] can be used to maintain a monotonic queue                   
* /  
#include <bits / STDC ++. H> 
#include <queue>
 the using  namespace STD;
 #define LL Long Long 
 #define N 200005 

LL n-, A [N], SUM [N], m, DP [N] [ 2 ]; 

int main () { 
    CIN >> >> n- m;
     for ( int I = . 1 ; I <= n-; I ++) Scanf ( " % LLD ",&a[i]);
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
    deque<int>q;
    q.push_back(0);
    for(int i=1;i<=n;i++){
        dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
        if(q.size()==0){
            dp[i][1]=a[i];
            q.push_back(i);
        }else {
            while(q.size()){
                int p=q.front();
                if(i-p>m){q.pop_front();continue;}
                else {
                    dp[i][1]=sum[i]+dp[p][0]-sum[p];
                    break;
                }
            }
            while(q.size()){
                int p=q.back();
                if(dp[p][0]-sum[p]<=dp[i][0]-sum[i])
                    q.pop_back();
                else break;
            }
            q.push_back(i);
        }
    }
    cout<<max(dp[n][0],dp[n][1])<<'\n';
} 

 

Guess you like

Origin www.cnblogs.com/zsben991126/p/12510294.html