洛谷P2569 [SCOI2010]股票交易(单调队列)
阅读原文时间:2024年11月20日阅读:1

传送门

惭愧……这种题目都没看出来……

首先,我们用$dp[i][j]$表示在第$i$天,手上有$j$股时的最大收益

第一,我们可以直接买股票,即$dp[i][j]=-j*AP_i$,这个直接计算即可

第二,我们可以不操作,那么$dp[i][j]=max(dp[i][j],dp[i-1][j])$

第三种,我们买股票,那么$dp[i][j]=max(dp[i][j],dp[i-w-1][k]+k*AP_i-j*AP_i)$

第四种,我们卖股票,那么$dp[i][j]=max(dp[i][j],dp[i-w-1][k]+k*BP_i-j*BP_i)$

然后发现三四两种情况把与$j$有关的提出来之后,里面的可以用单调队列优化

顺便注意情况三要从小到大搞,情况四要从大到小搞

//minamoto
#include
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) char buf[<<],*p1=buf,*p2=buf; templateinline bool cmax(T&a,const T&b){return a=;--j){
while(h<=t&&q[h]>j+bs) ++h;
while(h<=t&&dp[i-w-][q[t]]+q[t]*bp<=dp[i-w-][j]+j*bp) --t;
q[++t]=j,cmax(dp[i][j],dp[i-w-][q[h]]+q[h]*bp-j*bp);
}
}
for(int i=;i<=m;++i) cmax(ans,dp[n][i]);
printf("%d\n",ans);
return ;
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章