码迷,mamicode.com
首页 > 其他好文 > 详细

LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)

时间:2019-03-19 18:46:49      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:贪心   getc   inline   print   const   cpp   class   space   枚举   

传送门

解题思路

  不难想一个\(O(n^3)\)\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直接从\(f_{i-w-1}\)那一层转移来,转移时枚举一下当前买卖多少。考虑优化,发现每次其实就是一个区间取\(max\),是由\(AS\)\(BS\)所限制的区间,所以单调队列优化就好了,一个正着做一个倒着做,时间复杂度\(O(n^2)\)

代码

#include<bits/stdc++.h>

using namespace std;
const int N=2005;

inline int rd(){
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    return f?x:-x;
}

int n,Maxp,w,f[N][N],AP[N],BP[N],AS[N],BS[N];
int Q[N],head,tail;

int main(){
    memset(f,-0x3f,sizeof(f));
    n=rd(),Maxp=rd(),w=rd(); f[0][0]=0;
    for(int i=1;i<=n;i++)
        AP[i]=rd(),BP[i]=rd(),AS[i]=rd(),BS[i]=rd();
    for(int i=1;i<=n;i++){
        head=1; tail=0; f[i][0]=f[i-1][0];
        int Max=max(0,i-w-1);
        for(int j=1;j<=Maxp;j++){
            f[i][j]=f[i-1][j];
            if(j-Q[head]>AS[i]) head++;
            while(head<=tail && f[Max][j-1]-AP[i]>f[Max][Q[tail]]-AP[i]*(j-Q[tail])) tail--;
            Q[++tail]=j-1; f[i][j]=max(f[i][j],f[Max][Q[head]]-AP[i]*(j-Q[head]));
//          for(int k=1;k<=AS[i];k++){
//              if(k>j) break;
//              f[i][j]=max(f[i][j],f[max(0,i-w-1)][j-k]-AP[i]*k);
//          }
//          for(int k=1;k<=BS[i];k++){
//              if(j+k>Maxp) break;
//              f[i][j]=max(f[i][j],f[max(0,i-w-1)][j+k]+BP[i]*k);
//          }
        }
        head=1; tail=0;
        for(int j=Maxp-1;j>=0;j--){
            if(Q[head]-j>BS[i]) head++;
            while(head<=tail && f[Max][j+1]+BP[i]>f[Max][Q[tail]]+BP[i]*(Q[tail]-j)) tail--;
            Q[++tail]=j+1; f[i][j]=max(f[i][j],f[Max][Q[head]]+BP[i]*(Q[head]-j));
        }
    }
    /*
    for(int i=1;i<=n;i++)
        for(int j=0;j<=Maxp;j++)
            printf("f[%d][%d]=%d\n",i,j,f[i][j]);
    */
    printf("%d\n",f[n][0]);
    return 0;
}

LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)

标签:贪心   getc   inline   print   const   cpp   class   space   枚举   

原文地址:https://www.cnblogs.com/sdfzsyq/p/10560371.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!