【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( ...
随机推荐
- [转载红鱼儿]Delphi XE7 update1进步太大了
写以下的文字是怀着无比兴奋的心情写的,急于同朋友们分享XE7的进步! 1.更新的bug列表并不全 通过bug修正列表及发布的消息,可以看到up1修正了很多bug,正如我所说,有些bug并没有写到发布的 ...
- python之数据类型1
什么是数据类型及数据类型分类 python中的数据类型 python使用对象模型来存储数据,每一个数据类型都有一个内置的类,每新建一个数据,实际就是在初始化生成一个对象,即所有数据都是对 ...
- hdu-1069(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 题意:一群猴子,给出n块砖的长x宽y高z,用这些砖拼起的高度最高是多少, 要求底下的砖的长宽都要 ...
- IntelliJ IDEA 2017版 spring-boot修改端口号配置把端口号改为8081
1.修改端口号主要是通过配置文件修改.如图: 完整版配置 ######################################################## ###server 配置信息 ...
- 链家笔试链家——找寻最小消费获取最大平均分java
链家找寻最小消费获取最大平均分 输入: 5 5 4#表示科目数n,每科最大分值r,平均分avg 5 2#每科的实际得分,分数加1分的消耗的能量 4 7 3 1 3 2 2 5 输出: 4 #到达n*a ...
- timescale
`timescale 1ns/100ps 表示时延单位为1ns, 时延精度为100ps.`timescale 编译器指令在模块说明外部出现, 并且影响后面所有的时延值.
- SPSS—回归—二元Logistic回归案例分析
数据分析真不是一门省油的灯,搞的人晕头转向,而且涉及到很多复杂的计算,还是书读少了,小学毕业的我,真是死了不少脑细胞, 学习二元Logistic回归有一段时间了,今天跟大家分享一下学习心得,希望多指教 ...
- (dp)Tickets --HDU --1260
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1260 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- C++ 11可变参数接口设计在模板编程中应用的一点点总结
概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...
- POJ1066线段交点
POJ1066 题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径 ...