[BZOJ 2442]修剪草坪
转载请注明出处:http://danihao123.is-programmer.com/
单调队列优化DP……
bi了doge了……现在才能学会一些简单的单调队列优化DP
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | /************************************************************** 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; } |
9 年前
%%%%%!!
这题窝当时 WA 了一上午 ……
9 年前
@Menci: %%%%%%我这提做了很长时间才会,而且没有您的题解我现在不会会单调队列优化DP的
9 年前
@danihao123: 说得好像我会一样
9 年前
@danihao123: 说得好像我会一样(手动滑稽