题目链接:戳我

看到这个题目,我们有一个朴素的DP想法(但是为什么我会先想到网络流啊喂,果然是菜鸡

设\(dp[i][j][0/1/2]\)表示第i天不进行交易/买入/卖出,现在手上有j张票,前i天能够获得的最大收益。转移什么的随便弄弄就行了吧。

然后发现自己智障了,0/1/2根本不用划分好吗.......于是就变成了这个样子......\(dp[i][j]\)表示现在手上有j张票,前i天能够获得的最大收益。

\(dp[i][j]=max(dp[i][j],dp[i-1][j])\)
\(dp[i][j]=max(dp[i][j],dp[i-w-1][k]-ap[i]*(j-k))\)
\(dp[i][j]=max(dp[i][j],dp[i-w-1][k]+bp[i]*(k-j))\)

于是50分到手。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAXN 2010
using namespace std;
int n,m,w;
int ap[MAXN],bp[MAXN],as[MAXN],bs[MAXN];
long long dp[MAXN][MAXN];
int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%d%d%d",&n,&m,&w);for(int i=1;i<=n;i++)scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=-0x3f3f3f3f3f3f3f3f;dp[0][0]=0;for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){dp[i][j]=max(dp[i][j],dp[i-1][j]);for(int k=max(0,j-as[i]);k<=j-1;k++){int cur=max(0,i-w-1);dp[i][j]=max(dp[i][j],dp[cur][k]-1ll*ap[i]*(j-k));}for(int k=j+1;k<=m&&k<=j+bs[i];k++){int cur=max(0,i-w-1);dp[i][j]=max(dp[i][j],dp[cur][k]+1ll*bp[i]*(k-j));}}}long long ans=0;for(int i=0;i<=m;i++) ans=max(ans,dp[n][i]);printf("%lld\n",ans);return 0;
}

之后我们考虑一下怎么把这个K给去掉。
把转移方程化一下:
\(dp[i][j]=max(dp[i-1][j])\)
\(dp[i][j]=max(dp[i-w-1][k]+k*ap[i])-ap[i]*j (j-as[i]\le k \le j-1)\)
\(dp[i][j]=max(dp[i-w-1][k]+k*bp[i])+bp[i]*j (j+1\le k\le j+bs[i])\)

我们发现那个取max的部分是可以用单调队列优化的.......
于是就100pts了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#define MAXN 2010
using namespace std;
int n,m,w;
int ap[MAXN],bp[MAXN],as[MAXN],bs[MAXN],q[MAXN];
long long dp[MAXN][MAXN];
int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%d%d%d",&n,&m,&w);for(int i=1;i<=n;i++)scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=-0x3f3f3f3f3f3f3f3f;for(int i=1;i<=n;i++) dp[i][0]=0;for(int i=1;i<=n;i++){for(int j=0;j<=as[i];j++) dp[i][j]=-ap[i]*j;for(int j=0;j<=m;j++) dp[i][j]=max(dp[i][j],dp[i-1][j]);if(i-w-1>=0){int head=1,tail=0;for(int j=0;j<=m;j++){while(head<=tail&&q[head]<j-as[i]) head++;while(head<=tail&&dp[i-w-1][j]+ap[i]*j>=dp[i-w-1][q[tail]]+ap[i]*q[tail]) tail--;q[++tail]=j;dp[i][j]=max(dp[i][j],dp[i-w-1][q[head]]-ap[i]*(j-q[head]));}head=1,tail=0;for(int j=m;j>=0;j--){while(head<=tail&&q[head]>j+bs[i]) head++;while(head<=tail&&dp[i-w-1][j]+j*bp[i]>=dp[i-w-1][q[tail]]+q[tail]*bp[i]) tail--;q[++tail]=j;dp[i][j]=max(dp[i][j],dp[i-w-1][q[head]]+bp[i]*(q[head]-j));}}}long long ans=0;for(int i=0;i<=m;i++) ans=max(ans,dp[n][i]);printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10888289.html

SCOI2010 股票交易相关推荐

  1. [SCOI2010]股票交易

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

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

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

  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. Spring Boot知识清单
  2. python怎么跳转到某一行代码_Python中免验证跳转到内容页的实例代码
  3. 第97课 寻找亲密数对_例97.1 《小学生C++编程入门》
  4. 1*2*...*1000的末尾有多少个0?(Java实现)
  5. binary.Write 小坑一个兼论go的错误处理哲学
  6. AIM Tech Round 5C. Rectangles 思维
  7. [译]用javascript实现一门编程语言-词法分析
  8. strcmp函数的实现
  9. Apache CXF 框架结构和基本原理
  10. 用excel打印工资条
  11. 使用Aspose给PDF加密,免受未经授权的访问和内容篡改
  12. 让WIN2003和2008服务器iis支持安卓应用.apk文件下载的配置方法
  13. (10万+浏览量)语句覆盖、条件覆盖(分支覆盖)、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖 的区别
  14. 小心被举报!考研复试后不要分享考试内容!
  15. [深入理解SSD 为SSD编程] SSD的架构和基准
  16. 【富文本】3如何制作U盘系统盘
  17. 网络安全法及个人信息法律解读
  18. “打怪升级”,电竞浪潮中一家非典型公司的生存之道
  19. c语言高级算法bc,老调重弹篇:有关BC/C++语言程序编程学习的:10大基础算法科普帖...
  20. Android手游外挂入侵----寓攻于守,方能破敌

热门文章

  1. 逻辑回归的总结(详细步骤)
  2. 深度学习利器: TensorFlow系统架构及高性能程序设计
  3. Blind Return Oriented Programming (BROP) Attack - 攻击原理
  4. Linux 内核自解压流程分析
  5. vs五子棋c语言代码,五子棋代码C语言版.doc
  6. bn层初始化参数_神经网络参数初始化方式
  7. 仪表自定义刻度值_史上最全的仪表选型,就差你还没看了
  8. 图像数据流识别圆形_人工智能大赛视觉处理(一)图形识别
  9. python发送短信接口_python发送短信和发送邮件
  10. CVPR 2020 《PhraseCut: Language-based Image Segmentation in the Wild》论文笔记