题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=1855

题解:

DP,单调队列优化。
(好久没做 DP题,居然还意外地想出来了)

定义 dp[i][k] 表示前 i天,手上还有 k股的最大收益。
(注意这个定义是个前缀的形式)
假设枚举到了第 i天,令 j=i-W-1。
那么dp[i][]就由dp[j][]转移而来。(说了是前缀形式的啦,就不要去枚举 j-1,j-2...了)
转移还是比较显然的:
枚举第 i 天结束手上还剩的股数 k:
      枚举今日购买 d张:cmax(dp[i][k],dp[j][k-d]-d*AP);
      枚举今日卖出 d张:cmax(dp[i][k],dp[j][k+d]+d*BP);
      然后再来一个前缀的转移:cmax(dp[i][k],dp[i-1][k]);
这个复杂度是 T*MAXP*MAXP的,只能过 50分。

考虑优化(以购买转移为例),
显然转移的区间为连续的一段,
即若对于 dp[i][k]来说,转移来源是 dp[j][k-1]~dp[j][k-AS]。
且不难发现,如果 k-1>=x>y>=k-AS,且 dp[j][x] > dp[j][y]-val  (val=(x-y)*AP),
那么如论如何dp[j][y]都不可能贡献答案。

所以就用单调队列维护每次转移的最值就好啦。
一个小技巧:在从 计算 dp[i][k] 到 计算 dp[i][k+1] 时,
显然单调队列里的旧元素的贡献相比刚刚加进队列的 newval=dp[j][k]来说都会减一个 AP,
但不好整体修改,(难道你想用数据结构维护?)
所以就令新加进队列的值 newval=dp[j][k]+k*AP
保持好队列里的元素的相对大小关系就好了(即dp[j][k-1]始终比dp[j][k]多减了一个AP)。
(卖出的转移就类似了。)
最终复杂度可以做到 T*MAXP

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 2005
#define ll long long
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
ll dp[MAXN][MAXN],qv[MAXN],ANS,newval;
int T,MAXP,W,AP,BP,AS,BS,qk[MAXN];
void cmax(ll &a,ll b){if(a<b) a=b;
}
int main()
{filein(trade); fileout(trade);memset(dp,0xcc,sizeof(dp)); dp[0][0]=0;scanf("%d%d%d",&T,&MAXP,&W);for(int i=1,j,l,r;i<=T;i++){ //2000scanf("%d%d%d%d",&AP,&BP,&AS,&BS);j=max(i-W-1,0);for(int k=0;k<=MAXP;k++)//50->2000 //前缀形式,今日不做任何操作 cmax(dp[i][k],dp[i-1][k]);l=1;r=1; qk[l]=0; qv[l]=dp[j][0];for(int k=1;k<=MAXP;k++){//50->2000//购置 //for(int d=1;d<=AS&&k-d>=0;d++) cmax(dp[i][k],dp[j][k-d]-1ll*d*AP);while(l<=r&&k-qk[l]>AS) l++;cmax(dp[i][k],dp[j][qk[l]]-1ll*(k-qk[l])*AP);newval=dp[j][k]+1ll*k*AP;while(l<=r&&qv[r]<=newval) r--; r++; qk[r]=k; qv[r]=newval;         }l=1;r=1; qk[l]=MAXP; qv[l]=dp[j][MAXP];for(int k=MAXP-1;k>=0;k--){//50->2000//出售 //for(int d=1;d<=BS&&k+d<=MAXP;d++) cmax(dp[i][k],dp[j][k+d]+1ll*d*BP);while(l<=r&&qk[l]-k>BS) l++;cmax(dp[i][k],dp[j][qk[l]]+1ll*(qk[l]-k)*BP);newval=dp[j][k]-1ll*(MAXP-k)*BP;while(l<=r&&qv[r]<=newval) r--; r++; qk[r]=k; qv[r]=newval;          }} //for(int k=0;k<=MAXP;k++) cmax(ANS,dp[T][k]);cout<<dp[T][0];return 0;
}

转载于:https://www.cnblogs.com/zj75211/p/8005145.html

●BZOJ 1855 [Scoi2010]股票交易相关推荐

  1. [SCOI2010]股票交易

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

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

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

  3. BZOJ 1856: [Scoi2010]字符串 [Catalan数]

    1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1418  Solved: 790 [Submit][Status ...

  4. BZOJ 1854: [Scoi2010]游戏( 二分图最大匹配 )

    匈牙利算法..从1~10000依次找增广路, 找不到就停止, 输出答案. --------------------------------------------------------------- ...

  5. bzoj 1854: [Scoi2010]游戏(并查集)

    1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 5265  Solved: 2101 [Submit][Statu ...

  6. bzoj 1856: [Scoi2010]字符串(卡特兰数)

    1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1604  Solved: 904 [Submit][Status ...

  7. SCOI2010 股票交易

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

  8. bzoj 1858: [Scoi2010]序列操作

    2016-06-21 一看就是线段树,就是标记相互冲突,处理好,其余都是平常的. 1 #include<iostream> 2 #include<cstring> 3 #inc ...

  9. android图片转换为二进制流,Android图片二进制与Bitmap、Drawable之间的转换

    Android图片二进制与Bitmap.Drawable之间的转换 Java代码 public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutput ...

最新文章

  1. 分库分表之后,主键的处理方法
  2. mysql maxtmptables_mysql的tmp_table_size和max_heap_table_size
  3. 创业者具备的五大技能_赛事动态 | 新道科技连续六年支持全国职业院校技能大赛沙盘模拟企业经营赛项...
  4. idea生成方法注释的正确方法
  5. 如何通过 Tampermonkey 快速查找 JavaScript 加密入口
  6. python天气查询_Python学习笔记——天气查询代码
  7. 水性丙烯酸酯共聚物流变改性剂行业调研报告 - 市场现状分析与发展前景预测
  8. get方式乱码post方式不会乱码原因
  9. SnakeWords开发--Android 2.2
  10. pycharm windows 重置_pycharm重置设置,恢复默认设置
  11. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 ARIMA、AutoARIMA、LSTM、Prophet、多元Prophet 实现
  12. 曲线坐标系与直角坐标系转换(一)——基础:matlab插值函数简介
  13. cdr添加节点快捷键_cdr快捷键大全_cdr教程【图文】
  14. QQ名片点赞全自动引流脚本,基于autojs的
  15. WordPress好看的自适应企业站Start主题
  16. EduCoder-Web程序设计基础-html5—结构元素-第3关:figure元素和figcaption元素的应用
  17. 不同平方的电线都能带动哪些家用电器
  18. VisionPro使用C#编写脚本
  19. CEO自测问卷:你是公司的天花板吗?
  20. 计算机网络安全的脆弱性,网络安全及网络安全评估的脆弱性分析

热门文章

  1. 计算机桌面壁纸怎样拉伸,win10桌面壁纸怎么拉伸?手把手教你拉伸win10桌面壁纸的方法...
  2. 32利用文件系统保存数据_网易技术实践|Docker文件系统实战
  3. Lombok ——自动化方法生成器
  4. 表级锁的mysql读写_Mysql的表级锁
  5. python排名上升_TIOBE:2019年7月全球编程语言排行 Python热度继续上升
  6. uniapp打包成html5包个ios壳,HBuilder之uni-app打包App方法
  7. nfc卡模式与标准模式_渠道如何标准化管理,建立新的销售模式,提升业绩完成率...
  8. c语言表达式与变量区别,C语言实战开发————基础秘籍1(C与C++的区别,输入输出,函数,变量,运算符)...
  9. linux测试函数耗时tick数,C语言中怎样测验函数执行时间
  10. python3软件怎么使用_python3怎么使用pip