传送门

题目分析:

\(f[i][j]\)表示第i天,手中拥有j份股票的最优利润。

  • 如果不买也不卖,那么$$f[i][j] = f[i-1][j]$$
  • 如果买入,那么$$f[i][j] = max{f[i - w - 1][k] - A_p*(j - k)} (j - as + 1 \le k \le j)$$由于是从小的更新大的,所以顺序
  • 如果卖出,那么$$f[i][j] = max{f[i - w - 1][k] + B_p*(k - j)} (j \le k \le j + bs - 1)$$由于是从大更新小的,所以倒序

    现在已经得到了一个\(n^3\)转移的方法,现在来考虑如何优化成\(n^2\)。



    形如这样的方程,具有决策单调性,可以使用单调队列优化。将上面推得的后两个方程整理得

\[f[i][j] = max\{(f[i - w - 1][k] + A_p * k) - A_p * j\}
\]

\[f[i][j] = max\{(f[i - w - 1][k] + B_p * k) - B_p *j)\}
\]

中间括号前的用单调队列维护单调性,每次插入时更新决策。

code

#include<bits/stdc++.h>
using namespace std;
const int N = 2005, OO = 0x3f3f3f3f;
int n, w, maxp;
int f[N][N], ans;
typedef pair<int, int> P;
P que[N];
struct node{
int ap, bp, as, bs;
}d[N]; int main(){
scanf("%d%d%d", &n, &maxp, &w);
for(register int i = 1; i <= n; i++)
scanf("%d%d%d%d", &d[i].ap, &d[i].bp, &d[i].as, &d[i].bs);
memset(f, -OO, sizeof f);
for(register int i = 1; i <= n; i++){
for(register int j = 0; j <= d[i].as; j++) f[i][j] = -d[i].ap * j; //初始化为只买股票
for(register int j = 0; j <= maxp; j++) f[i][j] = max(f[i][j], f[i - 1][j]);
if(i - w - 1 >= 0){
register int head = 1, tail = 0;
for(register int j = 0; j <= maxp; j++){ //从小的转移,顺序
while(head <= tail && que[head].first < j - d[i].as) head++;
while(head <= tail && que[tail].second <= f[i - w - 1][j] + d[i].ap * j) tail--;
que[++tail] = P(j, f[i - w - 1][j] + d[i].ap * j);
if(head <= tail) f[i][j] = max(f[i][j], que[head].second - d[i].ap * j);
}
head = 1, tail = 0;
// for(int j = 0; j <= maxp; j++){ //错误
for(register int j = maxp; j >= 0; j--){ //从大的转移,倒序
while(head <= tail && que[head].first > j + d[i].bs) head++;
while(head <= tail && que[tail].second <= f[i - w - 1][j] + d[i].bp * j) tail--;
que[++tail] = P(j, f[i - w - 1][j] + d[i].bp * j);
if(head <= tail) f[i][j] = max(f[i][j], que[head].second - d[i].bp * j);
}
}
}
printf("%d", f[n][0]);
return 0;
}

BZOJ 1855 股票交易 - 单调队列优化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. BZOJ1855 股票交易 单调队列优化 DP

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

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

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

  9. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

随机推荐

  1. VC 常见问题百问

    http://www.cnblogs.com/cy163/archive/2006/06/19/429796.html 经典Vc书 Charles Petzold 的<Programming W ...

  2. (转)ORA-01940: cannot drop a user that is currently connected 问题解析

    删除数据库用户的时候经常会遇到这样的错误: ORA: cannot drop a user that is currently connected 原因是有程序在连接我们需要删除的用户,我们删除用户之 ...

  3. [Android5.1]ActivityManagerService启动过程分析

    ActivityManagerService(简称AMS)是Android系统的关键服务之中的一个.它的主要作用例如以下: 管理系统中全部应用进程的整个生命周期 管理应用进程中的Activity.Se ...

  4. swift开发多线程篇 - NSThread 线程相关简单说明(一些使用和注意点)

    一 说明 本文涉及代码可以从https://github.com/HanGangAndHanMeimei/Code地址获得. 二 NSThread的基本使用和创建 1)基本用法(主线程|当前线程) 1 ...

  5. 动态规划求解序列问题(LIS、JLIS)

    1. 最长递增子序列 不要求位置连续:要求大小严格递增(strictly increasing) 穷举法解题 首先以每个数字为单位分割寻找最长递增子序列: int lis(const vector&l ...

  6. 【Codeforces Round #440 (Div. 2) A】 Search for Pretty Integers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先枚举一个数字的情况. 再枚举两个数的情况就好. [代码] #include <bits/stdc++.h> #defi ...

  7. IPv4与IPv6数据报格式详解

    摘要: 本文给出IPv4与IPv6数据报格式示意图,并整理了各个字段含义,最后对比IPv4与IPv6数据报格式的区别. 一.IPv4数据报 图1 IPv4数据报格式版本号(version) 不同的IP ...

  8. Swift 带有动画效果的TabBarItem

    额...貌似挺长时间没有总结新知识了,最近在看swift,之前swift刚出来的时候大体看了一遍,后来时间长了没看加之swift2.0做了比较大的调整,公司项目也不是用swift写的,也就没怎么看了, ...

  9. Nginx+ 多个Memcached+ 多个Tomcat集群配置来实现 sticky Session

    假如有 大于2 台的Tomcat servers,如何实现sticky session特点的高可靠web 服务? 方案设计: 前端使用nginx(最好是淘宝的 tengine)作为we 流量分发器,向 ...

  10. stm32的DMA传输一半中断

    这里本想做一个录音程序 硬件很简单: MIC(麦克风)放大滤波电路---->stm32的ADC----->DMA通道----->一个数组缓存------->通过FATFS的  ...