题目描述

思路

  蒟蒻还是太弱了,,就想到半个方程就GG了,至于什么单调队列就更想不到了。

  $f[i][j]$表示第$i天有j$张股票的最大收益。

  那么有四种选择:

  1. 不买股票:$f[i][j]=max(f[i][j],f[i-1][j])$
  2. 买$j$张股票,之前没有买:$f[i][j]=-j*ap[i]$
  3. 买$j$张股票,之前有过交易,中间间隔了$w$天:$f[i][j]=max(f[i][j],f[i-w-1][k]-(j-k)*ap[i])$
  4. 卖$j$张股票,之前有过交易(废话),中间间隔了$w$天,$f[i][j]=max(f[i][j],f[i-w-1][k]+(k-j)*bp[i])$

  方程列出来了,还是很好理解的。那么怎么优化呢?我们发现$i,j,k$都要枚举$O(n^3)$的复杂度是会$T$的,我们需要用一些优化。

  我们发现:3转移中$f[i-w-1][k]-(j-k)*ap[i]=f[i-w-1][k]+k*ap[i]-j*ap[i]$,这样我们在第i天时只要找出最大的$f[i-w-1][k]+k*ap[i]$即可,因为前两维$i,j$已知,$j*ap[i]$是常数。

  用一个递减的单调队列维护使$f[i-w-1][k]+k*ap[i]$最大的$k$,每次取队首转移即可,注意如果$as[i]<j-k$(即买不了这么多股票)时,需要把队首弹出。那么4也是一样,维护最大的$f[i-w-1][k]+k*bp[i](bs[i]<k-j)$

code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=;
int n,m,w,ap,bp,as,bs;
int f[N][N],q[N],head,tail; int main()
{
scanf("%d%d%d",&n,&m,&w);
memset(f,,sizeof(f));//负无穷
for(int i=;i<=n;i++)
{
scanf("%d%d%d%d",&ap,&bp,&as,&bs);
for(int j=;j<=as;j++)f[i][j]=-ap*j;//转移2
for(int j=;j<=m;j++)f[i][j]=max(f[i-][j],f[i][j]);//转移1
if(i<=w)continue;//之前不能进行交易
head=,tail=;
for(int j=;j<=m;j++)
{
while(head<=tail&&q[head]<j-as)
head++;//不够买
while(head<=tail&&f[i-w-][q[tail]]+q[tail]*ap<=f[i-w-][j]+j*ap)
tail--;//单调性
q[++tail]=j;//加入新元素
if(head<=tail)
f[i][j]=max(f[i][j],f[i-w-][q[head]]+q[head]*ap-j*ap);//转移3
}
head=,tail=;
for(int j=m;j>=;j--)
{
while(head<=tail&&q[head]>j+bs)
head++;//不够卖
while(head<=tail&&f[i-w-][q[tail]]+q[tail]*bp<=f[i-w-][j]+j*bp)
tail--;//单调性
q[++tail]=j;//加入新元素
if(head<=tail)
f[i][j]=max(f[i][j],f[i-w-][q[head]]+q[head]*bp-j*bp);//转移4
}
}
cout<<f[n][];//最后一天全部卖出即为最优
}

股票交易——单调队列优化DP的更多相关文章

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

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

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

  3. 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP

    上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...

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

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

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

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

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

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

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

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

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

  9. 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)

    传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...

随机推荐

  1. 怎么给slice加一个Insert方法呢?而不用丑陋的两次append….

    package main import ( "fmt" "reflect" ) func Insert(slice interface{}, pos int, ...

  2. 设置Activity全屏的方法:

    1)代码隐藏ActionBar 在Activity的onCreate方法中调用getActionBar.hide();即可 2)通过requestWindowFeature设置 requestWind ...

  3. 设计模式----创建型模式之工厂模式(FactoryPattern)

    工厂模式主要分为三种简单工厂模式.工厂方法模式.抽象工厂模式三种.顾名思义,工厂主要是生产产品,作为顾客或者商家,我们不考虑工厂内部是怎么一个流程,我们要的是最终产品.将该种思路放在我们面向对象开发实 ...

  4. java不支持多继承

    java不支持多继承,但支持多重继承,即一个类只能继承一个类,使用extends关键字 一个类可以实现多个接口,接口之间用逗号分隔,使用implements关键字 一个接口可以继承多个其他接口,接口之 ...

  5. HTTP/1.1与HTTP/2有什么区别?

    介绍 超文本传输​​协议(HTTP)是一种应用协议,自1989年发明以来,它一直是事实上在万维网上进行通信的标准.从1997年发布HTTP / 1.1到最近,对它的修改很少.协议.但是在2015年,重 ...

  6. 02-20 kd树(鸢尾花分类)

    [TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...

  7. 【NOIP模拟赛】小奇挖矿 2

    [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小奇最初在0 ...

  8. Go routine 编排框架:oklog/run 包

    目录 Go routine 编排框架:oklog/run 包 问题引入 oklog/run 包介绍 使用例子 参考资料 Go routine 编排框架:oklog/run 包 问题引入 oklog/r ...

  9. CH3803扑克牌

    Description 背景 lqhsr生日那天,Rainbow来找lqhsr玩扑克牌-- 玩着玩着Rainbow觉得太没意思了,于是决定给lqhsr一个考验~~~ 描述 Rainbow把一副扑克牌( ...

  10. 代码审计-YXcms1.4.7

    题外: 今天是上班第一天,全都在做准备工作,明天开始正式实战做事. 看着周围稍年长的同事和老大做事,自己的感觉就是自己还是差的很多很多,自己只能算个废物. 学无止境,我这样的垃圾废物就该多练,保持战斗 ...