P2569 股票交易
题目大意:
你初始时有∞ 元钱,并且每天持有的股票不超过 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 股票交易的更多相关文章
- 洛谷P2569 股票交易
题目传送门https://www.luogu.org/problemnew/show/P2569 第一眼看题就觉得是个dp ,然后看到2000的范围,hmm大概是个n^2的2维dp 开始设状态,第一维 ...
- 洛谷P2569 股票交易 [SCOI2010] dp
正解:dp+单调队列优化 解题报告: 先放个传送门鸭qwq umm首先dp转移挺好想的?就买和不买 f[i][j]表示第i天手上有j的股份的最多钱,转移也很好想?就枚举第1天到第i-w-1天枚举买k股 ...
- 洛谷P2569 股票交易【dp】【单调队列】
题目描述 最近 \text{lxhgww}lxhgww 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\text{lxhgww}lxhgww 预测到了 ...
- 【Luogu】P2569股票交易(单调队列优化DP)
题目链接 首先这题可以肯定的是朴素DP秒出.然后单调队列优化因为没接触过所以不会emmm 而且脑补没补出来 坐等四月省选倒数第一emmm 心态爆炸,偷懒放题解链接 #include<cstdio ...
- 洛谷P2569 [SCOI2010]股票交易
P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...
- [luogu] P2569 [SCOI2010]股票交易 (单调队列优化)
P2569 [SCOI2010]股票交易 题目描述 最近 \(\text{lxhgww}\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(\te ...
- 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569
题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ...
- P2569 [SCOI2010]股票交易 dp 单调队列优化
LINK:股票交易 题目确实不算难 但是坑点挺多 关于初值的处理问题我就wa了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...
- P2569 [SCOI2010]股票交易
最近 \(lxhgww\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(lxhgww\) 预测到了未来 \(T\) 天内某只股票的走势,第 \( ...
随机推荐
- Github学习心得体会
https://github.com/Accredit/TEST 在本学期第一次接触Github,在系统的学习了Github的使用之后,自己对Github有了一个基本的使用了解.在这个过程中,自己也认 ...
- github个人作业
信息学院本科生课程设计 题目 文件加密和解密 课程名称 面向对象程序设计课程设计 课程编号 X031749 所在专业 计算机科学与技术 所在班级 计科高职13-3 ...
- 战神答题APP 无敌结束版
APP发布了哦~~ 多多捧场~ http://anzhuoyuan.com/app/info/appid/242381.html 还有github https://github.com/784 ...
- [转] Linux有问必答:如何修复“sshd error: could not load host key”
编译自:http://ask.xmodulo.com/sshd-error-could-not-load-host-key.html作者: GOLinux 本文地址:https://linux.cn/ ...
- [2017BUAA软工]个人项目:数独
一.项目地址 https://github.com/Slontia/Sudoku 附加作业(GUI):https://github.com/Slontia/SudokuGUI 二.开发时间 PSP2. ...
- TCP的TIME_WAIT
http://www.cnblogs.com/dadonggg/p/8778318.html http://www.firefoxbug.com/index.php/archives/2795/ ht ...
- 【转】XSHELL下直接下载文件到本地(Windows)
XSHELL下直接下载文件到本地(Windows) http://www.cnblogs.com/davytitan/p/3966606.html
- String()与toString的区别
1..toString()可以将所有的的数据都转换为字符串,但是要排除null 和 undefined 代码示例: var a = null.toString()--报错 var b = underf ...
- 关于gzip zgrep zcat 的使用
最近由于重构代码,要判断很多接口是否还在使用,然后就要从现在已有日志里面去找 是否还有调用.我很疑惑,如果要一个一个文件从文件系统里面拷贝出来然后再使用grep cat vi 等方法去查找该有多麻烦. ...
- Lodop图片输出ADD_PRINT_IMAGE 有白边
ADD_PRINT_IMAGE输出图片,如果使用img标签(即超文本<img标签),是超文本,无论是相对路径,网络图片,还是base64,都可能有白边,这可能和超文本解析有关.ADD_PRINT ...