bzoj1855: [Scoi2010]股票交易--单调队列优化DP

时间:2021-03-04 08:37:09

单调队列优化DP的模板题

不难列出DP方程:

bzoj1855: [Scoi2010]股票交易--单调队列优化DP

对于买入的情况

由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]}

AP[i]*j是固定的,在队列中维护dp[i-w-1][k]+k*Ap[i]的单调性即可

 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 using namespace std;
 ;
 ]; 

 int main(){
     scanf("%d%d%d", &T, &maxP, &w);
     ; i<=T; i++)
         scanf("%d%d%d%d", &Ap[i], &Bp[i], &As[i], &Bs[i]);
     memset(dp,-,sizeof(dp));
     ; i<=T; i++){
         ; j<=As[i]; j++) dp[i][j]=-Ap[i]*j;
         ; j<=maxP; j++) dp[i][j]=max(dp[i][j], dp[i-][j]);
         >=){
             , tail=;
             ; j<=maxP; j++){
                 while (head<tail && q[head]+As[i]<j) head++;
                 ][j]+j*Ap[i] >= dp[i-w-][q[tail-]]+q[tail-]*Ap[i]) tail--;
                 q[tail++]=j;
                 ][q[head]]-(j-q[head])*Ap[i]);
             }
             head=, tail=;
             ; j--){
                 while (head<tail && q[head]-Bs[i]>j) head++;
                 ][j]+j*Bp[i] >= dp[i-w-][q[tail-]]+q[tail-]*Bp[i]) tail--;
                 q[tail++]=j;
                 ][q[head]]+(q[head]-j)*Bp[i]);
             }
         }
     }
     ;
     ; i<=maxP; i++)
         ans=max(ans, dp[T][i]);
     printf("%d\n", ans);
     ;
 }