洛谷题目连接:[SCOI2010]股票交易

题目描述

最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律。

通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每个i,都有APi>=BPi),但是每天不能无限制地交易,于是股票交易所规定第i天的一次买入至多只能购买ASi股,一次卖出至多只能卖出BSi股。

另外,股票交易所还制定了两个规定。为了避免大家疯狂交易,股票交易所规定在两次交易(某一天的买入或者卖出均算是一次交易)之间,至少要间隔W天,也就是说如果在第i天发生了交易,那么从第i+1天到第i+W天,均不能发生交易。同时,为了避免垄断,股票交易所还规定在任何时间,一个人的手里的股票数不能超过MaxP。

在第1天之前,lxhgww手里有一大笔钱(可以认为钱的数目无限),但是没有任何股票,当然,T天以后,lxhgww想要赚到最多的钱,聪明的程序员们,你们能帮助他吗?

输入输出格式

输入格式:

输入数据第一行包括3个整数,分别是T,MaxP,W。

接下来T行,第i行代表第i-1天的股票走势,每行4个整数,分别表示APi,BPi,ASi,BSi。

输出格式:

输出数据为一行,包括1个数字,表示lxhgww能赚到的最多的钱数。

输入输出样例

输入样例#1:

5 2 0
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1

输出样例#1:

3

说明

对于30%的数据,0<=W<T<=50,1<=MaxP<=50

对于50%的数据,0<=W<T<=2000,1<=MaxP<=50

对于100%的数据,0<=W<T<=2000,1<=MaxP<=2000

对于所有的数据,1<=BPi<=APi<=1000,1<=ASi,BSi<=MaxP

一句话题意: 每天最多可以买进\(as_i\)张股票,卖出\(bs_i\)张股票,但是每个时刻手中的票最多都只能有\(maxp\)张,每买入一张股票可以获得\(ap_i\)元,卖出一张股票可以获得\(bp_i\)元,且如果第\(i\)天进行了交易,那么从第\(i+1\)到第\(i+w\)天都不能再进行交易,问到第\(n\)天最多可以获得的价值.

题解: 这个数据范围显然是能DP的.我们先想一下状态该如何定义.

首先根据这个状态转移的条件,有交易的天数限制,所以显然是需要一维来存交易到第几天的.然后是对于手中持有的股票数量的限制,显然至少是需要一重循环来枚举目前手中持有的股票数量的,所以考虑将这个也加入状态中.可得状态\(f[i][j]\)表示到第\(i\)天手中持有\(j\)张股票的最大利益.那么最后的答案就是
\(f[n][0]\),因为显然在最后一天把所有股票都卖出不会比留着股票差.

然后想一下如何转移这个状态.那么从上一个状态到现在的状态\(f[i][j]\),显然只有这几种情况:

  • 第\(i-1\)天没有买/卖股票,第\(i\)天的最大收益为\(f[i-1][j]\).
  • 第\(i-w-1\)天进行了股票的买卖且拥有\(k(k<j)\)张股票,第\(i\)天有股票\(j\)张,此时买入了\(j-k\)张股票,可得最大收益为\(f[i][j] = max(f[i][j], f[i-w-1][k]-(j-k)*ap[i])\)
  • 第\(i-w-1\)天进行了股票的买卖且拥有\(k(k>j)\)张股票,第\(i\)天有股票\(j\)张,此时卖出了\(k-j\)张股票,可得最大收益为\(f[i][j]=max(f[i][j], f[i-w-1][k]+(k-j)*bp[i])\)

此外没有别的转移方式了,所以可以列出状态转移方程.

那么考虑了状态转移之后,仔细想想发现这个时间复杂度是\(O(T*maxp^2)\)的,显然这样是不能过100%的数据的.所以需要使用一些优化.

这里我们将这个状态转移方程展开一下,发现:
\[f[i-w-1][k]+(k-j)×bp[i]=(f[i-w-1][k]+k×bp[i])-j×bp[i]\]
也就是说,在枚举了\(i,j\)的情况下,\(i,j\)是可以看做常数的,那么此时对答案有影响的就只有\(k\)了 .并且我们发现, 如果\(j\)是以正确的顺序枚举的,那么\(k\)也就是逐渐在平移的了.比如说买入股票,那么拥有的股票也就会越来越多,卖出的话拥有的股票就会越来越少,事实上这个是符合 单调队列优化的条件的,所以我们可以考虑将目前拥有的股票数存入单调队列中,优化后复杂度为\(O(T*maxp)\).

当然分开和卖出的两种情况是要分开使用队列的,因为他们各自具有单调性,但是合起来并没有.

#include<bits/stdc++.h>
using namespace std;
const int N=2000+5;int n, maxp, w, ap[N], bp[N], as[N], bs[N], ans = 0;
int f[N][N], h1, h2, t1, t2, q1[N], q2[N];int main(){cin >> n >> maxp >> w;for(int i=1;i<=n;i++)cin >> ap[i] >> bp[i] >> as[i] >> bs[i];memset(f, 128, sizeof(f)); f[0][0] = 0;for(int i=1;i<=n;i++){for(int j=0;j<=maxp;j++)f[i][j] = max(f[i][j], f[i-1][j]);for(int j=0;j<=as[i];j++)f[i][j] = max(f[i][j], -1*j*ap[i]);if(i <= w) continue;h1 = h2 = 1, t1 = t2 = 0;for(int j=0;j<=maxp;j++){while(h1 <= t1 && f[i-w-1][q1[t1]]-ap[i]*(j-q1[t1]) <= f[i-w-1][j]) t1--;while(h1 <= t1 && j-q1[h1] > as[i]) h1++;q1[++t1] = j;if(h1 <= t1) f[i][j] = max(f[i][j], f[i-w-1][q1[h1]]-(j-q1[h1])*ap[i]);}h1 = h2 = 1, t1 = t2 = 0;for(int j=maxp;j>=0;j--){while(h2 <= t2 && f[i-w-1][q2[t2]]+bp[i]*(q2[t2]-j) <= f[i-w-1][j]) t2--;while(h2 <= t2 && q2[h2]-j > bs[i]) h2++;q2[++t2] = j;if(h2 <= t2) f[i][j] = max(f[i][j], f[i-w-1][q2[h2]]+(q2[h2]-j)*bp[i]);}}printf("%d\n", f[n][0]);return 0;
}

转载于:https://www.cnblogs.com/BCOI/p/9133358.html

[SCOI2010]股票交易相关推荐

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

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

  2. SCOI2010 股票交易

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

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

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

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

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

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

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

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

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

  7. 2021—10—31 上课笔记

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

  8. 退役前的做题记录2.0

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

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

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

最新文章

  1. Swift - 简单的原生与网页交互
  2. 计算机组成微程序设计,计算机组成原理微程序设计.doc
  3. 如何提高UI自动化测试的质量
  4. Head First JSP---随笔九(部署Web应用)
  5. cocos2d-x游戏开发(十)执行单元场景CCScene
  6. easyui combobox默认选中项
  7. phpcmsV9框架:安装教程
  8. python单自由度振动计算-数据可视化2
  9. JavaScript中的匿名函数遇上!会怎么样
  10. Sharepoint CAML 增删改查 List
  11. Facebook秘密文件泄露:赚钱(和背锅)是AI的使命
  12. Error: Your project contains C++ files but it is not using a supported native build system
  13. 用Python自动发送邮件
  14. 解决systemback 无法生成超过4G的iso的问题
  15. Unity WebGL 发布内存优化
  16. 谷歌浏览器任务栏图标变白色解决方法(亲测有效!)
  17. 信息学奥赛一本通 1296:开餐馆(evd)
  18. excel文件打不开怎么办_移动硬盘打不开提示格式化怎么办?
  19. 计算机认识新朋友教案,认识新朋友教案
  20. 计算机带不起大型游戏怎么回事,电脑玩不起来大型网络游戏怎么办

热门文章

  1. 虚拟网卡与物理网卡TCP协议数据传输对比
  2. C#获取动态代码的值
  3. 企业IT解决方案经验分享活动
  4. C语言学习笔记(一)_hello world
  5. JavaOne 2016——首日亮点
  6. 【kAriOJ】离散数学春季学期编程测试 1
  7. 关于Python多线程的理解
  8. cas单点登录原理碎碎念
  9. oracle 10g数据库的异步提交
  10. Buffer Cache Hit Ratio