上一篇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的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 1855: [Scoi2010]股票交易[单调队列优化DP]

    1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1083  Solved: 519[Submit][Status] ...

  4. LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)

    传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直 ...

  5. SCOI 股票交易 单调队列优化dp

    这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...

  6. BZOJ 1855 股票交易 - 单调队列优化dp

    传送门 题目分析: \(f[i][j]\)表示第i天,手中拥有j份股票的最优利润. 如果不买也不卖,那么\[f[i][j] = f[i-1][j]\] 如果买入,那么\[f[i][j] = max\{ ...

  7. BZOJ1855 股票交易 单调队列优化 DP

    描述 某位蒟佬要买股票, 他神奇地能够预测接下来 T 天的 每天的股票购买价格 ap, 股票出售价格 bp, 以及某日购买股票的上限 as,  某日出售股票上限 bs, 并且每次股票交 ♂ 易 ( 购 ...

  8. BZOJ1855 [Scoi2010]股票交易[单调队列dp]

    题 题面有点复杂,不概括了. 后面的状态有前面的最优解获得大致方向是dp.先是瞎想了个$f[i][j]$表示第$i$天手里有$j$张股票时最大收入(当天无所谓买不买). 然后写了一个$O(n^4)$状 ...

  9. 股票交易——单调队列优化DP

    题目描述 思路 蒟蒻还是太弱了,,就想到半个方程就GG了,至于什么单调队列就更想不到了. $f[i][j]$表示第$i天有j$张股票的最大收益. 那么有四种选择: 不买股票:$f[i][j]=max( ...

随机推荐

  1. Servlet的Cookie值保存与获取

    今天测试设置和获取Cookie遇到了一点小问题,很奇怪的问题:把J2ee服务部署在本地 8080端口:访问任何一个服务时,如果客户端没有cookie,则下发cookie, 如果客户端已经有了该cook ...

  2. 2018.10.14 NOIP训练 圣诞树(简单dp)

    传送门 sbDP题. 曾经一直TLE不知道为什么. 这次发现输入有坑233. 代码

  3. 2018.07.08 hdu5316 Magician(线段树)

    Magician Problem Description Fantasy magicians usually gain their ability through one of three usual ...

  4. hdu -1114(完全背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 思路:求出存钱罐装全部装满情况下硬币的最小数量,即求出硬币的最小价值.转换为最小背包的问题. # ...

  5. Unit Testing of Spring MVC Controllers1

    我们的pom.xml文件相关的部分看起来如下: <dependency>    <groupId>com.fasterxml.jackson.core</groupId& ...

  6. RESTful架构概念

    本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...

  7. LVDS_IP仿真分析

    这个一个对tx_outclock移相180度后的仿真结果. tx_outclock的时钟沿与数据中心对齐. tx_coreclock时钟与inclock时钟频率相等,但有相差.

  8. iOS中清除缓存的方法 以及SDWebimage自带的清除缓存方法

    1  SDWebimage中 (1)  计算缓存的大小 单位 : (MB) CGFloat size = [[SDImageCache sharedImageCache] getSize] / 102 ...

  9. noip第8课作业

    1.     计算书费 [问题描述]下面是一个图书的单价表: 计算概论 28.9 元/本 数据结构与算法 32.7 元/本 数字逻辑 45.6元/本 C++程序设计教程 78 元/本 人工智能 35  ...

  10. Java 连接 Memcached 服务

    原文:http://www.runoob.com/memcached/java-memcached.html mac下安装和配置Memcached:http://www.pchou.info/open ...