Link:

BZOJ 1855 传送门

Solution:

比较明显的$dp$模型

令$dp[i][j]$为第$i$天持有$j$支股票时的最大利润

对其购买股票和售出股票分别$dp$,这里以购买为例:

$dp[i][j]=max\{ dp[lst][k]-ap*(j-k)\}$

发现可以将递归式转化为仅与$k$相关的$dp[lst][k]+ap*k$和仅与$j$相关的$ap*j$

于是可以利用单调队列将复杂度降到$O(n)$,时刻保持$j-k\le as$即可

要注意初始化,一开始要先全置为$-INF$

对于$[0,as]$的项的初始值为$max(dp[i-1][j],-ap*j)$

Code:

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef pair<int,int> P;
const int MAXN=,INF=<<;
P q[MAXN];
int l,r,n,mx,sep,res=-INF;
int ap,bp,as,bs,lst,dp[MAXN][MAXN]; int main()
{
scanf("%d%d%d",&n,&mx,&sep);
for(int i=;i<MAXN;i++) for(int j=;j<MAXN;j++)
dp[i][j]=-INF;
for(int i=;i<=n;i++)
{
scanf("%d%d%d%d",&ap,&bp,&as,&bs);
for(int j=;j<=as;j++) dp[i][j]=-ap*j;
for(int j=;j<=mx;j++) dp[i][j]=max(dp[i][j],dp[i-][j]); int lst=i-sep-;
if(lst<) continue;
l=;r=;
for(int j=;j<=mx;j++)
{
while(l<=r&&j-q[l].X>as) l++;
while(l<=r&&q[r].Y<=dp[lst][j]+ap*j) r--;
q[++r]=P(j,dp[lst][j]+ap*j);
dp[i][j]=max(dp[i][j],q[l].Y-ap*j);
} l=;r=;
for(int j=mx;j>=;j--)
{
while(l<=r&&q[l].X-j>bs) l++;
while(l<=r&&q[r].Y<=dp[lst][j]+bp*j) r--;
q[++r]=P(j,dp[lst][j]+bp*j);
dp[i][j]=max(dp[i][j],q[l].Y-bp*j);
}
res=max(res,dp[i][]);
}
printf("%d",res);
return ;
}

[BZOJ 1855] 股票交易的更多相关文章

  1. BZOJ 1855 股票交易(单调队列优化DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1855 题意:最近lxhgww又迷上了投资股票, 通过一段时间的观察和学习,他总结出了股票 ...

  2. BZOJ 1855 股票交易 (算竞进阶习题)

    单调队列优化dp dp真的是难..不看题解完全不知道状态转移方程QAQ 推出方程后发现是关于j,k独立的多项式,所以可以单调队列优化.. #include <bits/stdc++.h> ...

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

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

  4. BZOJ 1855: [Scoi2010]股票交易(DP+单调队列)

    1855: [Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未 ...

  5. ●BZOJ 1855 [Scoi2010]股票交易

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1855 题解: DP,单调队列优化.(好久没做 DP题,居然还意外地想出来了) 定义 dp[i ...

  6. 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569

    题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ...

  7. bzoj 1855: [Scoi2010]股票交易

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  8. 股票交易(bzoj 1855)

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  9. BZOJ 1855 [Scoi2010]股票交易 ——动态规划

    DP方程是比较简单的,主要有三种:什么都不做.买入.卖出. 发现买入卖出都是$\Theta (n^3)$但是转移方程都是线性的,而且决策和当前的情况是分开的. 所以可以单调队列优化. 复杂度$\The ...

随机推荐

  1. Exponial (欧拉定理+指数循环定理+欧拉函数+快速幂)

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2021 Description Everybody loves big numbers ...

  2. css优先级机制

    所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.   1.important >(内联样式)Inline style  >(内部样式)Internal style sheet ...

  3. Sqlmap使用教程

    sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了. 今天把我一 ...

  4. Redis 分片实现 Redis Shard [www]

    Redis 分片实现                                             Redis Shard https://www.oschina.net/p/redis-s ...

  5. 调用start()与run()的区别

    1.调用start()方法: 通知“线程规划器”当前线程已经准备就绪,等待调用线程对象的run()方法.这个过程就是让系统安排一个时间来调用Thread中的run()方法,使线程得到运行,启动线程,具 ...

  6. c++设计模式系列----单例模式(Singleton模式

    单例模式是为了解决唯一对象实例问题而提出来的,许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单 ...

  7. JVM核心机制(类加载器、三种类加载器、代理加载模式、双亲委派机制

  8. chain模块将两个列表合并

    示例代码 from itertools import chain v1 = [11,22,33] v2 = ['a','b','c'] for item in chain(v1,v2): print( ...

  9. hdu 1853(拆点判环+费用流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  10. srcache_nginx+redis构建缓存系统

    http://www.ttlsa.com/nginx/construction-of-srcache_nginx_redis-caching-system/ http://blog.csdn.net/ ...