【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP
上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp。
我先丢一道题:bzoj1855
此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚钱的最大值。
不难推出以下式子:
f[i][j]=max{f[k][l]+(l−j)×bp[i],l∈[j,j+bs[i]]f[k][l]−(j−l)×ap[i],l∈[j−as[i],j]}k∈[1,i−w]
考虑到第i天持有的j只股票不一定全是第i天购买的,则对于∀j,有f[i][j]≥f[i−1][j],式子可化为O(n^3),变为:
f[i][j]=max{f[i−w−1][l]+(l−j)×bp[i],l∈[j,j+bs[i]]f[i−w−1][l]−(j−l)×ap[i],l∈[j−as[i],j]}
考虑到i,j≤1000,如采用此做法依然会TLE,我们考虑采用单调队列进行优化,以下以卖出股票举例:
我们设k<l<j,我们认为f[i−w−1][k]比f[i−w−1][l]优,则必然满足f[i−w−1][k]>f[i−1−1][l]+(k−l)×bp[i]。
我们对于每一个i,维护一个f[i−w−1]的单调队列,采用上述的判定机制删除非最优元素,同时考虑到k,l应位于区间[j,j+bs[i]]中,则需从队头删除下标不位于该区间的元素,最优用队头元素更新f[i][j]即可。
买入同理。
1 #include<bits/stdc++.h> 2 #define M 4010 3 using namespace std; 4 int f[M][M/2]={0},ap[M]={0},bp[M]={0},as[M]={0},bs[M]={0}; 5 int t,n,w,head,tail,q[M]={0},id[M]={0}; 6 int main(){ 7 scanf("%d%d%d",&t,&n,&w); 8 for(int i=w+1;i<=t+w;i++) scanf("%d%d%d%d",ap+i,bp+i,as+i,bs+i); 9 for(int i=0;i<=w;i++) 10 for(int j=1;j<=n;j++) f[i][j]=-1234567890; 11 for(int i=w+1;i<=t+w;i++){ 12 for(int j=0;j<=n;j++) f[i][j]=f[i-1][j]; 13 head=tail=0; 14 for(int j=1;j<=n;j++){ 15 if(head<tail&&id[head+1]<j-as[i]) head++; 16 while(head<tail&&q[tail]-f[i-w-1][j-1]<((j-1)-id[tail])*ap[i]) tail--; 17 q[++tail]=f[i-w-1][j-1]; id[tail]=j-1; 18 if(head<tail) f[i][j]=max(f[i][j],q[head+1]-(j-id[head+1])*ap[i]); 19 } 20 head=tail=0; 21 for(int j=n-1;j>=0;j--){ 22 if(head<tail&&j+bs[i]<id[head+1]) head++; 23 while(head<tail&&f[i-w-1][j+1]-q[tail]>(id[tail]-(j+1))*bp[i]) tail--; 24 q[++tail]=f[i-w-1][j+1]; id[tail]=j+1; 25 if(head<tail) f[i][j]=max(f[i][j],q[head+1]+(id[head+1]-j)*bp[i]); 26 } 27 } 28 printf("%d\n",f[t+w][0]); 29 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!