【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP
上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp。
我先丢一道题:bzoj1855
此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚钱的最大值。
不难推出以下式子:
$f[i][j]=max\left\{
\begin{aligned}
f[k][l]+(l-j)\times bp[i] , l \in [j,j+bs[i]]\\
f[k][l]-(j-l)\times ap[i] , l \in [j-as[i],j]\\
\end{aligned}
\right \}
k \in [1,i-w]$
考虑到第i天持有的j只股票不一定全是第i天购买的,则对于$\forall j$,有$f[i][j]≥f[i-1][j]$,式子可化为O(n^3),变为:
$f[i][j]=max\left\{
\begin{aligned}
f[i-w-1][l]+(l-j)\times bp[i] , l \in [j,j+bs[i]]\\
f[i-w-1][l]-(j-l)\times ap[i] , l \in [j-as[i],j]\\
\end{aligned}
\right \}$
考虑到$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) \times bp[i]$。
我们对于每一个$i$,维护一个$f[i-w-1]$的单调队列,采用上述的判定机制删除非最优元素,同时考虑到$k,l$应位于区间$[j,j+bs[i]]$中,则需从队头删除下标不位于该区间的元素,最优用队头元素更新f[i][j]即可。
买入同理。
#include<bits/stdc++.h>
#define M 4010
using namespace std;
int f[M][M/]={},ap[M]={},bp[M]={},as[M]={},bs[M]={};
int t,n,w,head,tail,q[M]={},id[M]={};
int main(){
scanf("%d%d%d",&t,&n,&w);
for(int i=w+;i<=t+w;i++) scanf("%d%d%d%d",ap+i,bp+i,as+i,bs+i);
for(int i=;i<=w;i++)
for(int j=;j<=n;j++) f[i][j]=-;
for(int i=w+;i<=t+w;i++){
for(int j=;j<=n;j++) f[i][j]=f[i-][j];
head=tail=;
for(int j=;j<=n;j++){
if(head<tail&&id[head+]<j-as[i]) head++;
while(head<tail&&q[tail]-f[i-w-][j-]<((j-)-id[tail])*ap[i]) tail--;
q[++tail]=f[i-w-][j-]; id[tail]=j-;
if(head<tail) f[i][j]=max(f[i][j],q[head+]-(j-id[head+])*ap[i]);
}
head=tail=;
for(int j=n-;j>=;j--){
if(head<tail&&j+bs[i]<id[head+]) head++;
while(head<tail&&f[i-w-][j+]-q[tail]>(id[tail]-(j+))*bp[i]) tail--;
q[++tail]=f[i-w-][j+]; id[tail]=j+;
if(head<tail) f[i][j]=max(f[i][j],q[head+]+(id[head+]-j)*bp[i]);
}
}
printf("%d\n",f[t+w][]);
}
【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP的更多相关文章
- 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]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
- 1855: [Scoi2010]股票交易[单调队列优化DP]
1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ...
- LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)
传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直 ...
- SCOI 股票交易 单调队列优化dp
这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...
- BZOJ 1855 股票交易 - 单调队列优化dp
传送门 题目分析: \(f[i][j]\)表示第i天,手中拥有j份股票的最优利润. 如果不买也不卖,那么\[f[i][j] = f[i-1][j]\] 如果买入,那么\[f[i][j] = max\{ ...
- BZOJ1855 股票交易 单调队列优化 DP
描述 某位蒟佬要买股票, 他神奇地能够预测接下来 T 天的 每天的股票购买价格 ap, 股票出售价格 bp, 以及某日购买股票的上限 as, 某日出售股票上限 bs, 并且每次股票交 ♂ 易 ( 购 ...
- BZOJ1855 [Scoi2010]股票交易[单调队列dp]
题 题面有点复杂,不概括了. 后面的状态有前面的最优解获得大致方向是dp.先是瞎想了个$f[i][j]$表示第$i$天手里有$j$张股票时最大收入(当天无所谓买不买). 然后写了一个$O(n^4)$状 ...
- 股票交易——单调队列优化DP
题目描述 思路 蒟蒻还是太弱了,,就想到半个方程就GG了,至于什么单调队列就更想不到了. $f[i][j]$表示第$i天有j$张股票的最大收益. 那么有四种选择: 不买股票:$f[i][j]=max( ...
随机推荐
- Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决
关于Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决, 可想,一个固定的字符串MS都能找到,按常理动态绑定也应该没问题的,只需在前面标记它是一个Path类型的值它就能 ...
- vertical-align和text-align
vertical-align只适用于内联元素. 垂直对齐:vertical-align属性(转) 行高与单行纯文字的垂直居中,而如果行内含有图片和文字,在浏览器内浏览时,读者可以发现文字和图片在垂直方 ...
- c++中类的静态数据成员
有时需要为某个类的所有对象分配一个单一的存储空间,这个存储空间只是被这个类的对象访问,其他人不能访问,那么这时静态的成员变量是有用的.例如下面用来统计一共创建了多少个对象的变量num class cl ...
- 2018.07.17 CQOI2017 余数求和(整除分块)
洛谷传送门 bzoj传送门 这道题要用到学习莫比乌斯反演时掌握的整除分块算法,也就是对于一个数n" role="presentation" style="pos ...
- 今天研究了一下手机通信录管理系统(C语言)
题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查 ...
- linux week3
2.如何快速的回到 上⼀一次所在的位置 cd An argument of - is equivalent to $OLDPWD. cd - #cd $OLDPWD cd - #快速的回到 上 ...
- POJ3045 Cow Acrobats 2017-05-11 18:06 31人阅读 评论(0) 收藏
Cow Acrobats Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4998 Accepted: 1892 Desc ...
- SpringMVC绑定到实体数组、list、set、和map时要注意
实体的属性前一定要用.分割,如果是使用jquery的ajax提交的一个js数组对象,则请求数据会被格式化为 var sub = [{name:1,num:2},{name:1,num:2}] $.po ...
- log.debug(e.getMessage());
private static final Log log = LogFactory.getLog(AbcAction.class); @ManagedProperty(name = "abc ...
- [微信开发] 微信网页授权Java实现
功能:主要用于在用户通过手机端微信访问第三方H5页面时获取用户的身份信息(openId,昵称,头像,所在地等..)可用来实现微信登录.微信账号绑定.用户身份鉴权等功能. 开发前的准备: 1.需 ...