题目大意:

你初始时有∞ 元钱,并且每天持有的股票不超过 Maxp 。 有 T 天,你知道每一天的买入价格( AP[i] ),卖出价格( Bp[i] ), 买入数量限制( AS[i] ),卖出数量限制( BS[i] )。 并且两次交易之间必须间隔 W 天。 现在问你 T 天结束后,最大收益是多少。

分析:

注意对题意的理解,虽然有无限的钱,但是买股票是要减少当前的收益的,收益是卖出的总钱数减去买入的钱数。收益并不是只增不减。

可以想到的是:动态规划。设f[i][j]表示前i天之后,剩下j股股票的最大收益。显然根据题意,在j相同的时候,i越往后的时候,f[i][j]越大。

状态转移方程,买入和卖出是相同的思路:

卖出:

f[i][j]=max(f[i-w-1][k]+(k-j)×bp[i]) (j<=k<=j+bs[i])

买入:

f[i][j]=max(f[i-w-1][k]-(j-k)×ap[i]) (j-as[i]<=k<=j)

这种情况的复杂度是O(T×Mp×Mp)直接T掉。

将转移方程括号展开,发现:

f[i-w-1][k]+(k-j)×bp[i]=(f[i-w-1][k]+k×bp[i])-j×bp[i]

在给定i,j的时候,唯一在变的变量就是k,k的取值会影响最大值。而且给予j正确的循环顺序,k的取值区间是逐渐在平移的。

想到了什么?

滑动窗口!单调队列!单调队列优化DP!

我们外层循环i,内层循环j,每次先除去过期的解,加上新的选择,再从单调队列队头取出最优解,进行更新。

注意:

1.在买入和卖出时,为了保证能转移德到j的所有元素都在队列里,j的循环顺序是不同的。

2.对于给定的i,处理买入卖出的顺序可以颠倒。无所谓。

3.当i-w-1小于0时,取0即可。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=+;
int t,mp,w;
int f[N][N];
int ans;
int q[N],hd=,tl=;
int main()
{
scanf("%d%d%d",&t,&mp,&w);
int ap,bp,as,bs;//并不需要数组
memset(f,0xcf,sizeof f);//初值负无穷
f[][]=;
for(int i=;i<=t;i++)
{
scanf("%d%d%d%d",&ap,&bp,&as,&bs);
hd=,tl=;
int from=max(,i-w-);//从何转移
for(int j=mp;j>=;j--)//卖出
{
f[i][j]=max(f[i][j],f[i-][j]);//可以今天不买不卖
while(hd<=tl&&(j+bs<q[hd])) hd++;//除去过期者
while(hd<=tl&&(f[from][q[tl]]+q[tl]*bp<f[from][j]+j*bp)) tl--;//因为从i的上一个状态来,所以先加入新元素
q[++tl]=j;
f[i][j]=max(f[i][j],f[from][q[hd]]+q[hd]*bp-j*bp);
}
hd=,tl=;
for(int j=;j<=mp;j++)//买入
{
f[i][j]=max(f[i][j],f[i-][j]);
while(hd<=tl&&(j-as>q[hd])) hd++;
while(hd<=tl&&(f[from][q[tl]]+q[tl]*ap<f[from][j]+j*ap)) tl--;
q[++tl]=j;
f[i][j]=max(f[i][j],f[from][q[hd]]+q[hd]*ap-j*ap);
}
}
for(int j=;j<=mp;j++)
ans=max(ans,f[t][j]);
printf("%d",ans);
return ;
}

总结:

1.对于决策转移时,有明显单调性的情况,对于状态移动时,转移决策重复度较大。都可用单调队列优化。

2.单调队列利用每个元素只能进一次,出一次,使得O(n)变为均摊O(1)复杂度,简化时间。

P2569 股票交易的更多相关文章

  1. 洛谷P2569 股票交易

    题目传送门https://www.luogu.org/problemnew/show/P2569 第一眼看题就觉得是个dp ,然后看到2000的范围,hmm大概是个n^2的2维dp 开始设状态,第一维 ...

  2. 洛谷P2569 股票交易 [SCOI2010] dp

    正解:dp+单调队列优化 解题报告: 先放个传送门鸭qwq umm首先dp转移挺好想的?就买和不买 f[i][j]表示第i天手上有j的股份的最多钱,转移也很好想?就枚举第1天到第i-w-1天枚举买k股 ...

  3. 洛谷P2569 股票交易【dp】【单调队列】

    题目描述 最近 \text{lxhgww}lxhgww 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\text{lxhgww}lxhgww 预测到了 ...

  4. 【Luogu】P2569股票交易(单调队列优化DP)

    题目链接 首先这题可以肯定的是朴素DP秒出.然后单调队列优化因为没接触过所以不会emmm 而且脑补没补出来 坐等四月省选倒数第一emmm 心态爆炸,偷懒放题解链接 #include<cstdio ...

  5. 洛谷P2569 [SCOI2010]股票交易

    P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...

  6. [luogu] P2569 [SCOI2010]股票交易 (单调队列优化)

    P2569 [SCOI2010]股票交易 题目描述 最近 \(\text{lxhgww}\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(\te ...

  7. 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569

    题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ...

  8. P2569 [SCOI2010]股票交易 dp 单调队列优化

    LINK:股票交易 题目确实不算难 但是坑点挺多 关于初值的处理问题我就wa了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...

  9. P2569 [SCOI2010]股票交易

    最近 \(lxhgww\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(lxhgww\) 预测到了未来 \(T\) 天内某只股票的走势,第 \( ...

随机推荐

  1. 利用阿里云的源yum方式安装Mongodb

    今天在线上服务器上安装MongoDB,从Mongo官网直接下载链接,结果在下载时发觉速度慢的可怜.迫于无奈,只能找国内的镜像下载.这里选择阿里云的源进行安装,记录如下: 1)在/etc/yum.rep ...

  2. LVM常规操作记录梳理(扩容/缩容/快照等)

    基本介绍Linux用户安装Linux 操作系统时遇到的一个最常见的难以决定的问题就是如何正确地给评估各分区大小,以分配合适的硬盘空间.随着 Linux的逻辑盘卷管理功能的出现,这些问题都迎刃而解, l ...

  3. 总结and规划

    不知不觉中又过去了一年,马上就要读研究生了,因此有必要对自己进行必要的总结,以及对自己有个良好的规划. 首先,描述自己当前的心情——对未来充满了恐惧和焦虑. 马上大学就要毕业了,回首经历的大学生涯,似 ...

  4. Linux内核分析第三周学习总结

    Linux内核源码简介 arch/ 该目录中包含和硬件体系结构相关的代码,每种平台占一个相应的目录. 和32位PC相关的代码存放在x86目录下. 每种平台至少包含3个子目录:kernel(存放支持体系 ...

  5. 读<架构漫谈>系列有感

    读了这一系列博文,我对架构也有了大致的了解.在简单的阅读之后,我解决了几个问题. 第一个问题,什么是架构? 要学习架构,首先要知道架构.那么,什么是架构呢?引用<架构漫谈(一)>里的话就是 ...

  6. HDOJ2099_整数的尾数

    一道我以为不会这么简单,然后暴力盲打竟然给过了的题. HDOJ2099_整数的尾数 #include<stdio.h> #include<stdlib.h> #include& ...

  7. NopCommerce源码架构

    我们承接以下nop相关的业务,欢迎联系我们. 我们承接NopCommerce定制个性化开发: Nopcommerce二次开发 Nopcommerce主题开发 基于Nopcommerce的二次开发的电子 ...

  8. 面象对象设计原则之三:里氏替换原则(The Liskov Substitution Principle,LSP)

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...

  9. [转帖]看完这篇文章你还敢说你懂JVM吗?

    看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...

  10. PRML读书笔记_绪论

    一.基本名词 泛化(generalization) 训练集所训练的模型对新数据的适用程度. 监督学习(supervised learning) 训练数据的样本包含输入向量以及对应的目标向量. 分类( ...