→BZOJ任意门←

很显然的动态规划题(笑)

容易想到DP的数组 f[i][j] 表示第i天手上有j股股票时能赚到最多的钱。

接下来就是转移了,有这么多变量一定要看清楚,仔细地分情况讨论。

每次转移时一共有四种情况:

(先从简单的入手)

一、第i天不买股票也不买

那就是从前一天相同的股票值更新过来

f[i][j]=max(f[i][j],f[i-1][j]);

那为什么是前一天而不是前几天呢?因为前几天的最优值都已经更新到前一天了呀。

二、第i天凭空买股票(相当于从之前手持0股票的情况更新来)

其实就是第i天的DP数组的初始化

For(j,0,As[i]) f[i] [j]=-1 * j * Ap[i];

三、第i天在第 i-w-1 天的基础上买股票

那我们设第i-w-1天的股票数为k,最直接的更新就是下面这样

f[i][j]=max(f[i][j], f[i-w-1][k]-(j-k)* Ap[i]);

但我们此时要更新的是j,所以可以稍稍转化一下:

  f[i][j]=max{ f[i-w-1][k]+k*Ap[i] } - j* Ap[i]

那么此时k的范围是多少呢 不难想到就是 [ j-As[i], j)

所以在k的取值范围上,有经验的OIer们应该都能想到单调队列了吧(!)

式子中有取max值,还有取值范围的经常都是用单调队列来优化(不知道具体如何操作的可以看代码)

四、第i天在第i-w-1天的基础上卖出股票

和上一种情况其实是一样的(式子的推导请参照上式自己操作)

f[i][j]=max{f[i-w-1][k]+k*Bp[i]}- j* Ap[i]

只是k的取值范围不一样了,变成了(j, j+Bs[i] ]

同样可以用单调队列来优化。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6
 7 #define For(i,a,b) for(register int i=a;i<=b;++i)
 8 #define Dwn(i,a,b) for(register int i=a;i>=b;--i)
 9 #define Re register
10
11 using namespace std;
12
13 const int N=2e3+10;
14 int f[N][N],q[N*2],qf,qr;
15 int n,m,As[N],Ap[N],Bs[N],Bp[N],W,T,MaxP;
16 inline void read(int &v){
17     v=0;
18     char c=getchar();
19     while(c<'0'||c>'9')c=getchar();
20     while(c>='0'&&c<='9')v=v*10+c-'0',c=getchar();
21 }
22 int main(){
23     read(T); read(MaxP); read(W);
24     For(i,1,T){
25         read(Ap[i]); read(Bp[i]);
26         read(As[i]); read(Bs[i]);
27     }
28     memset(f,128,sizeof(f));
29     For(i,1,T){
30         // I bought some stocks from nowhere
31         For(j,0,As[i]){
32             f[i][j]=-1*j*Ap[i];
33         }
34         // I didn't buy anything
35         For(j,0,MaxP){
36             f[i][j]=max(f[i][j],f[i-1][j]);
37         }
38
39         if(i-W-1<=0)continue;
40
41         // I bought some stock today after W days
42         qf=1; qr=0;
43         For(j,0,MaxP){
44             while(qf<=qr&&q[qf]<j-As[i])qf++;
45             if(qf<=qr){
46                 int k=q[qf];
47                 f[i][j]=max(f[i][j],f[i-W-1][k]+k*Ap[i]-j*Ap[i]);
48             }
49             while(qf<=qr&&f[i-W-1][q[qr]]+q[qr]*Ap[i]<=f[i-W-1][j]+j*Ap[i])qr--;
50             q[++qr]=j;
51         }
52
53         // I sold some stock today after W days
54         qf=1; qr=0;
55         Dwn(j,MaxP,0){
56             while(qf<=qr&&q[qf]>j+Bs[i])qf++;
57             if(qf<=qr){
58                 int k=q[qf];
59                 f[i][j]=max(f[i][j],f[i-W-1][k]+k*Bp[i]-j*Bp[i]);
60             }
61             while(qf<=qr&&f[i-W-1][q[qr]]+q[qr]*Bp[i]<=f[i-W-1][j]+j*Bp[i])qr--;
62             q[++qr]=j;
63         }
64     }
65     int fn=-2147483600;
66     For(i,0,MaxP)fn=max(fn,f[T][i]);
67     cout<<fn<<endl;
68     return 0;
69 }

转载于:https://www.cnblogs.com/HLAUV/p/9925646.html

【BZOJ1855】[Scoi2010] 股票交易相关推荐

  1. [SCOI2010]股票交易

    洛谷题目连接:[SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只 ...

  2. 洛谷P2569 [SCOI2010]股票交易

    P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...

  3. SCOI2010 股票交易

    题目链接:戳我 看到这个题目,我们有一个朴素的DP想法(但是为什么我会先想到网络流啊喂,果然是菜鸡) 设\(dp[i][j][0/1/2]\)表示第i天不进行交易/买入/卖出,现在手上有j张票,前i天 ...

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

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

  5. 提高篇 第五部分 动态规划 第5章 单调队列优化动态规划

    单调队列:是一种双端除列,其内部元素具有单调性. 最大队列 最小队列 操作: .插入:新元素插入队尾,删除除尾元素,直到找到插入后不会破坏单调性的为止. .获取最大(最小)值,访问队首元素. 单调队列 ...

  6. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  7. 2018年10月训练记录(10.1~10.23)

    前言 这篇博客记录的是我在201820182018年101010月的刷题列表. 由于时间比较匆忙,可能会有一些空链接,但我会尽快将它们补齐的. (目前链接已补至Oct7thOct\ 7thOct 7t ...

  8. 【水】【SCOI】 精简题解

    第二弹 [SCOI2009]生日快乐 搜索.递归划分问题. [SCOI2009]游戏 记忆化搜索.枚举素因子,DP. [SCOI2009]windy数 数位DP,分块统计. [SCOI2009]最长距 ...

  9. 2021—10—31 上课笔记

    DP主要的核心就是对于每道题专属的状态转移方程 动态规划过程是: 每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为 ...

  10. 洛谷试炼场 4-8单调队列

    layout: post title: 洛谷试炼场 4-8单调队列 author: "luowentaoaa" catalog: true mathjax: true tags: ...

最新文章

  1. 解决掉这些痛点和难点,让知识图谱不再是“噱头”
  2. 【Python 2.x和Python 3.x版本有什么区别】
  3. oracle 11g 1033,ORACLE出现错误1033和错误ORA-00600的解决方法
  4. 张帅用赢球庆生 搭档斯托瑟晋级澳网女双八强
  5. linux命令-eq是什么意思,linux查看系统信息命令
  6. SetWindowPos详解
  7. python工资高还是java-Python和Java哪个工资高
  8. ajax-page局部刷新分页实例
  9. Linux系统编程——进程间通信概述
  10. 电脑(PC)端独立截图软件
  11. TensorFlow激励函数
  12. Java docx4j 操作word 1.0
  13. 基于内容的图像检索系统设计与实现-java+mysql
  14. Axure的基本功能
  15. 新一代大数据技术架构
  16. 仙人掌之歌——路转峰回(1)
  17. 红米k30至尊纪念版和华为mate30pro哪个值得买
  18. canner CMS 系统 (公司在台湾) https://www.canner.io/
  19. 【C语言】两个整数最大公约数和最小公倍数
  20. PPT如何保存高分辨率高清jpg图片, 三种简单方法,无需其他软件辅助

热门文章

  1. 汇编学习--7.12--总结
  2. php fpm高并发,php-fpm 高并发、502解决方案
  3. 魔兽世界 8.1 服务器维护时间,魔兽世界8.1内容开放时间表介绍 8.1开放内容汇总介绍...
  4. innodb逻辑存储结构
  5. sbt命令行常用命令
  6. 调用sklearn包中的PLA算法[转载]
  7. MySQL数据库设置主从同步
  8. 数据库 MySQL 之 表操作、存储引擎
  9. JavaSceipt核心语法——运算符
  10. 如何用 Bash 创建一个二进制发布包