[BZOJ 2442]修剪草坪

danihao123 posted @ 2016年2月26日 14:46 in 题解 with tags usaco 动态规划 bzoj 单调队列 , 872 阅读
转载请注明出处:http://danihao123.is-programmer.com/

单调队列优化DP……

bi了doge了……现在才能学会一些简单的单调队列优化DP

代码:

/**************************************************************
    Problem: 2442
    User: danihao123
    Language: C++
    Result: Accepted
    Time:104 ms
    Memory:2532 kb
****************************************************************/
 
#include <cstdio>
#include <algorithm>
#include <queue>
#include <deque>
using namespace std;
const int maxn=100001;
struct DQueue{
    queue<long long> A;
    deque<long long> d;
    void push(long long x){
        A.push(x);
        while((!d.empty()) && (d.back()<x))
            d.pop_back();
        d.push_back(x);
    }
    long long top(){
        return d.front();
    }
    long long pop(){
        if(d.front()==A.front())
            d.pop_front();
        A.pop();
    }
    int size(){
        return A.size();
    }
};
long long S[maxn],d[maxn];
DQueue Q;
int main(){
    register int i;
    int n,k;
    long long temp;
    scanf("%d%d",&n,&k);
    S[0]=0;
    for(i=1;i<=n;i++){
        scanf("%lld",&temp);
        S[i]=S[i-1]+temp;
    }
    d[0]=0;
    Q.push(0);
    for(i=1;i<=n;i++){
        if(Q.size()>k)
            Q.pop();
        Q.push(d[i-1]-S[i]);
        d[i]=Q.top()+S[i];
        d[i]=max(d[i],d[i-1]);
    }
    printf("%lld\n",d[n]);
    return 0;
}
Menci 说:
Feb 29, 2016 09:53:35 PM

%%%%%!!
这题窝当时 WA 了一上午 ……

Avatar_small
danihao123 说:
Mar 02, 2016 12:37:47 PM

@Menci: %%%%%%我这提做了很长时间才会,而且没有您的题解我现在不会会单调队列优化DP的

Menci 说:
Mar 03, 2016 11:22:11 AM

@danihao123: 说得好像我会一样

Menci 说:
Mar 03, 2016 11:22:51 AM

@danihao123: 说得好像我会一样(手动滑稽


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter