【BZOJ1855】[Scoi2010] 股票交易
很显然的动态规划题(笑)
容易想到DP的数组 f[i][j] 表示第i天手上有j股股票时能赚到最多的钱。
接下来就是转移了,有这么多变量一定要看清楚,仔细地分情况讨论。
每次转移时一共有四种情况:
(先从简单的入手)
一、第i天不买股票也不买
那就是从前一天相同的股票值更新过来
f[i][j]=max(f[i][j],f[i-1][j]);
那为什么是前一天而不是前几天呢?因为前几天的最优值都已经更新到前一天了呀。
二、第i天凭空买股票(相当于从之前手持0股票的情况更新来)
其实就是第i天的DP数组的初始化
For(j,0,As[i]) f[i] [j]=-1 * j * Ap[i];
三、第i天在第 i-w-1 天的基础上买股票
那我们设第i-w-1天的股票数为k,最直接的更新就是下面这样
f[i][j]=max(f[i][j], f[i-w-1][k]-(j-k)* Ap[i]);
但我们此时要更新的是j,所以可以稍稍转化一下:
f[i][j]=max{ f[i-w-1][k]+k*Ap[i] } - j* Ap[i]
那么此时k的范围是多少呢 不难想到就是 [ j-As[i], j)
所以在k的取值范围上,有经验的OIer们应该都能想到单调队列了吧(!)
式子中有取max值,还有取值范围的经常都是用单调队列来优化(不知道具体如何操作的可以看代码)
四、第i天在第i-w-1天的基础上卖出股票
和上一种情况其实是一样的(式子的推导请参照上式自己操作)
f[i][j]=max{f[i-w-1][k]+k*Bp[i]}- j* Ap[i]
只是k的取值范围不一样了,变成了(j, j+Bs[i] ]
同样可以用单调队列来优化。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> #define For(i,a,b) for(register int i=a;i<=b;++i)
#define Dwn(i,a,b) for(register int i=a;i>=b;--i)
#define Re register using namespace std; const int N=2e3+;
int f[N][N],q[N*],qf,qr;
int n,m,As[N],Ap[N],Bs[N],Bp[N],W,T,MaxP;
inline void read(int &v){
v=;
char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')v=v*+c-'',c=getchar();
}
int main(){
read(T); read(MaxP); read(W);
For(i,,T){
read(Ap[i]); read(Bp[i]);
read(As[i]); read(Bs[i]);
}
memset(f,,sizeof(f));
For(i,,T){
// I bought some stocks from nowhere
For(j,,As[i]){
f[i][j]=-*j*Ap[i];
}
// I didn't buy anything
For(j,,MaxP){
f[i][j]=max(f[i][j],f[i-][j]);
} if(i-W-<=)continue; // I bought some stock today after W days
qf=; qr=;
For(j,,MaxP){
while(qf<=qr&&q[qf]<j-As[i])qf++;
if(qf<=qr){
int k=q[qf];
f[i][j]=max(f[i][j],f[i-W-][k]+k*Ap[i]-j*Ap[i]);
}
while(qf<=qr&&f[i-W-][q[qr]]+q[qr]*Ap[i]<=f[i-W-][j]+j*Ap[i])qr--;
q[++qr]=j;
} // I sold some stock today after W days
qf=; qr=;
Dwn(j,MaxP,){
while(qf<=qr&&q[qf]>j+Bs[i])qf++;
if(qf<=qr){
int k=q[qf];
f[i][j]=max(f[i][j],f[i-W-][k]+k*Bp[i]-j*Bp[i]);
}
while(qf<=qr&&f[i-W-][q[qr]]+q[qr]*Bp[i]<=f[i-W-][j]+j*Bp[i])qr--;
q[++qr]=j;
}
}
int fn=-;
For(i,,MaxP)fn=max(fn,f[T][i]);
cout<<fn<<endl;
return ;
}
【BZOJ1855】[Scoi2010] 股票交易的更多相关文章
- [bzoj1855][Scoi2010]股票交易_动态规划_单调队列
股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ...
- BZOJ1855 [Scoi2010]股票交易 【单调队列优化dp】
题目链接 BZOJ1855 题解 设\(f[i][j]\)表示第\(i\)天结束时拥有\(j\)张股票时的最大收益 若\(i \le W\),显然在这之前不可能有交易 \[f[i][j] = max\ ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- bzoj1855: [Scoi2010]股票交易
Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...
- 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)
传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
- BZOJ1855 [Scoi2010]股票交易[单调队列dp]
题 题面有点复杂,不概括了. 后面的状态有前面的最优解获得大致方向是dp.先是瞎想了个$f[i][j]$表示第$i$天手里有$j$张股票时最大收入(当天无所谓买不买). 然后写了一个$O(n^4)$状 ...
- 洛谷P2569 (BZOJ1855)[SCOI2010]股票交易 【单调队列优化DP】
Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...
- 【BZOJ1855】[Scoi2010]股票交易 DP+单调队列
[BZOJ1855][Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预 ...
- 【BZOJ1855】股票交易(动态规划,单调队列)
[BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最 ...
随机推荐
- 理解c/c++指针和引用
1 指针的指针 比如int* a,那么a是指向一个int型的对象的.也就是说,*前面的类型是该指针指向的对象的类型. 同理int** a的话,a指向一个int*型的对象,也就是说,它指向的对象也是一个 ...
- 阿里妈妈-RAP项目的实践(3)
接下来,我们就把我们的代码运用到项目中,因为我们前台是有jquery,后台管理系统是用angularjs mock在这两种的调用方式不一样,所以我就用nginx的proxy_pass 来代理 我在项目 ...
- 【C++基础学习】数据封装、构造函数
第一部分 类和对象 内存中按照用途被划分的五个区:栈区.堆区.全局区.常量区.代码区栈区由系统来进行控制,无论是内存的分配还是回收都不需要程序员关心堆区由new分配内存,使用完成之后必须使用delet ...
- LLVM的总结
LLVM 写在前面的话:无意中看到的LLVM的作者Chris Lattner相关的介绍和故事,觉得很有意思就贴上来,如果不感兴趣,可以直接跳入下一章. 关于LLVM 如果你对LLVM的由来陌生,那么我 ...
- 向sd卡读写数据
/data/data 是本地存储 /storage/ 是外部存储 SD卡存储 <uses-permission android:name="android.permission.WRI ...
- 安装MySQLdb出现的问题
枫竹梦的环境是自己编译安装的MySQL,安装目录在/usr/local/mysql. 下载MySQLdb,由于网络上大多数的链接都是指向比较老的sourceforge上,而我们安装最新的1.2.5,h ...
- zoom:1
zoom这个特性是IE特有的属性. zoom:1;一般是拿来解决IE6的子元素浮动时候父元素不随着自动扩大的问题,功能相当于overflow:auto,同样也可以用height:1%来代替zoom ...
- CSS3学习笔记(3)—左右飞入的文字
前几天看到一个企业招聘的动画觉得很炫,里面有个企业介绍的文字是用飞入的效果做出来的,今天尝试了写了一下,感觉还不错~\(≧▽≦)/~啦啦啦 下面来看我做的动态效果: 其实上面的效果很简单的,我的截图软 ...
- mysql批量sql插入优化
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...
- html5--5-3 给直线添加样式
html5--5-3 给直线添加样式 学习要点 strokeStyle属性:设置颜色.渐变或模式(本节课只涉及到颜色) lineWidth属性:--设置线宽 Canvas的路径方法 moveTo() ...