股票交易(DP+单调队列优化)
题目描述
最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律。
通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每个i,都有APi>=BPi),但是每天不能无限制地交易,于是股票交易所规定第i天的一次买入至多只能购买ASi股,一次卖出至多只能卖出BSi股。
另外,股票交易所还制定了两个规定。为了避免大家疯狂交易,股票交易所规定在两次交易(某一天的买入或者卖出均算是一次交易)之间,至少要间隔W天,也就是说如果在第i天发生了交易,那么从第i+1天到第i+W天,均不能发生交易。同时,为了避免垄断,股票交易所还规定在任何时间,一个人的手里的股票数不能超过MaxP。
在第1天之前,lxhgww手里有一大笔钱(可以认为钱的数目无限),但是没有任何股票,当然,T天以后,lxhgww想要赚到最多的钱,聪明的程序员们,你们能帮助他吗?
输入输出格式
输入格式:
输入数据第一行包括3个整数,分别是T,MaxP,W。(0<=W<T<=2000,1<=MaxP<=2000)
接下来T行,第i行代表第i-1天的股票走势,每行4个整数,分别表示APi,BPi,ASi,BSi。(1<=BPi<=APi<=1000,1<=ASi,BSi<=MaxP)
输出格式:
输出数据为一行,包括1个数字,表示lxhgww能赚到的最多的钱数。
输入样例#1:
5 2 0
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1
输出样例#1:
3
题目分析:
dp[i][j]代表第i天有j股票数的赚的最多的钱。递推关系分三类:
1.不买不卖 则是dp[i-1][j];
2.买后手里有k,则是dp[i-w-1][k]-(j-k)*ap[i];
3.卖后还有k,则是dp[i-w-1][k]+(k-j)*bp[i];
首先循环i,j是必要的,但是还要枚举买卖多少,复杂度显然不够,因此用单调队列优化。
#include <bits/stdc++.h>
using namespace std;
const int N=;
int ap[N],bp[N],as[N],bs[N];
int dp[N][N],qu[N];
int main()
{
int n,maxp,w;
scanf("%d%d%d",&n,&maxp,&w);
for(int i=;i<=n;i++)
scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);
memset(dp,-0x7f,sizeof dp);
for(int i=;i<=n;i++) dp[i][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=as[i];j++) dp[i][j]=-ap[i]*j;
for(int j=maxp;j>=;j--) dp[i][j]=max(dp[i][j],dp[i-][j]);
if(i-w->=)
{
int head=,tail=;
for(int j=;j<=maxp;j++)
{
while(head<=tail&&qu[head]<j-as[i]) head++;//买入大于sa[i]的出队
while(head<=tail&&dp[i-w-][j]+ap[i]*j>=dp[i-w-][qu[tail]]+ap[i]*qu[tail]) tail--;
qu[++tail]=j;
if(head<=tail) dp[i][j]=max(dp[i][j],dp[i-w-][qu[head]]-ap[i]*j+ap[i]*qu[head]);
}
head=,tail=;
for(int j=maxp;j>=;j--)
{
while(head<=tail&&qu[head]>j+bs[i]) head++;//卖出大于bs[i]的出队
while(head<=tail&&dp[i-w-][j]+bp[i]*j>=dp[i-w-][qu[tail]]+bp[i]*qu[tail]) tail--;
qu[++tail]=j;
if(head<=tail) dp[i][j]=max(dp[i][j],dp[i-w-][qu[head]]-bp[i]*j+bp[i]*qu[head]);
}
}
}
int ans=;
for(int i=;i<=maxp;i++)
ans=max(ans,dp[n][i]);
printf("%d\n",ans);
return ;
}
股票交易(DP+单调队列优化)的更多相关文章
- P2569 [SCOI2010]股票交易 dp 单调队列优化
LINK:股票交易 题目确实不算难 但是坑点挺多 关于初值的处理问题我就wa了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)
传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...
- 【Luogu】P2569股票交易(单调队列优化DP)
题目链接 首先这题可以肯定的是朴素DP秒出.然后单调队列优化因为没接触过所以不会emmm 而且脑补没补出来 坐等四月省选倒数第一emmm 心态爆炸,偷懒放题解链接 #include<cstdio ...
- [SCOI2010] 股票交易 (单调队列优化dp)
题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi, ...
- 股票交易 (单调队列优化DP)
股票交易 $ solution: $ 这道题以前就写了,题目很好,但自己没有发题解,来补一篇: 首先,题目出得很有迷惑性,但我们不难想到状态要设天数,和自己手上的股票数目(因为这两个就是充要信息).而 ...
- BZOJ1855 [Scoi2010]股票交易 【单调队列优化dp】
题目链接 BZOJ1855 题解 设\(f[i][j]\)表示第\(i\)天结束时拥有\(j\)张股票时的最大收益 若\(i \le W\),显然在这之前不可能有交易 \[f[i][j] = max\ ...
- 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)
这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...
随机推荐
- css对应中文字的英文名称
中文名 英文名 Unicode Unicode 2 Mac OS 华文细黑 STHeiti Light [STXihei] \534E\6587\7EC6\9ED1 华文细黑 华文黑体 STHeiti ...
- SpringBoot服务监控
SpringBoot服务监控分为客户端和服务端,即服务端是监控方,客户端为被监控方. 例如需要对线上的SpringBoot服务project-A进行监控,则project-A 为客户端.而监控的服务p ...
- Jmeter进行接口的性能测试
一.录制Jmeter脚本 录制Jmeter脚本有两种方法,一种是设置代理:一种则是利用badboy软件,badboy软件支持导出jmx脚本. 这里我们介绍第二种方法,利用badboy录制脚本,然后导出 ...
- [dp][uestc oj]J - 男神的约会
J - 男神的约会 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- POJ 4020 NEERC John's inversion 贪心+归并求逆序对
题意:给你n张卡,每张卡上有蓝色和红色的两种数字,求一种排列使得对应颜色数字之间形成的逆序对总数最小 题解:贪心,先按蓝色排序,数字相同再按红色排,那么蓝色数字的逆序总数为0,考虑交换红色的数字消除逆 ...
- Android(java)学习笔记105:Android启动过程(转载)
转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...
- 解除phpMyAdmin导入大型MySQL数据库文件大小限制
phpMyAdmin 导入大型数据库文件大小限制配置… 1. 修改 php.ini 文件中下列3项的值: upload_max_filesize, memory_limit 和 post_max_si ...
- Memcache使用基础
Memcached的特点: 协议简单 基于libevent的事件处理 内置内存存储方式 memcached不互相通信的分布式 1.协议简单: 使用简单的基于 ...
- Vmware 安装CentOS7时连不上网问题的解决
在VmWare 上安装Centos7时,装好vmware后还是连不上网,通过查找资料原来是因为有线网卡没有激活,默认centos和redhat7都是不启用有线网卡的,要么手动开启,要么安装时直接启用! ...
- Bootstrap滚动监听(Scrollspy)插件
Bootstrap滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标