DP/单调队列优化


  题解:http://www.cnblogs.com/jianglangcaijin/p/3799736.html

  令f[i][j]表示第 i 天结束后,手里剩下 j 股的最大利润,则有:

    \[  f[i][j]= \begin{cases} f[i-1][j] &   &{(不买不卖)}\\ f[i-w-1][k]-ap[i]*(j-k)&   &{ j-as[i] \leq k \leq j-1 (买入)}\\ f[i-w-1][k]+bp[i]*(k-j)&   &{ j+1 \leq k \leq j+bs[i] (卖出)} \end{cases} \]

  对于买入,我们将式子变形得到:

    $$ f[i][j]=f[i-w-1][k]+ap[i]*k-ap[i]*j $$

  我们知道单调队列优化可以将形如 $ f[i]=max/min \{ f[k] \}+g[i] $ 的式子中对k的枚举利用队列进行优化,这个式子中,"f[k]" 即是 $ f[i-w-1][k]+ap[i]*k $,“g[i]”即是 $ -ap[i]*j $,所以我们在枚举 j 的同时即可完成对k的维护(即每个f[i]都是一次单调队列优化下的DP)

  而卖出同理。

  1. /**************************************************************
  2. Problem: 1855
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:380 ms
  7. Memory:17068 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 1855
  11. #include<cmath>
  12. #include<vector>
  13. #include<cstdio>
  14. #include<cstring>
  15. #include<cstdlib>
  16. #include<iostream>
  17. #include<algorithm>
  18. #define rep(i,n) for(int i=0;i<n;++i)
  19. #define F(i,j,n) for(int i=j;i<=n;++i)
  20. #define D(i,j,n) for(int i=j;i>=n;--i)
  21. #define pb push_back
  22. using namespace std;
  23. int getint(){
  24. int v=,sign=; char ch=getchar();
  25. while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
  26. while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
  27. return v*=sign;
  28. }
  29. const int N=,INF=~0u>>;
  30. typedef long long LL;
  31. /******************tamplate*********************/
  32.  
  33. struct node{
  34. int x,y;
  35. node(int _=,int __=):x(_),y(__){}
  36. }q[N];
  37. int f[N][N];
  38. int main(){
  39. #ifndef ONLINE_JUDGE
  40. freopen("1855.in","r",stdin);
  41. freopen("1855.out","w",stdout);
  42. #endif
  43. int n=getint(),m=getint(),w=getint();
  44. F(i,,n) F(j,,m) f[i][j]=-INF;
  45. int ans=,ap,bp,as,bs;
  46. F(i,,n){
  47. ap=getint(); bp=getint(); as=getint(); bs=getint();
  48. F(j,,as) f[i][j]=-ap*j;
  49. F(j,,m) f[i][j]=max(f[i][j],f[i-][j]);
  50. int k=i-w-;
  51. if (k>=){
  52. int st=,ed=;
  53. F(j,,m){
  54. while(st<ed && q[st].x<j-as) st++;
  55. while(st<ed && q[ed-].y<=f[k][j]+ap*j) ed--;
  56. q[ed++]=node(j,f[k][j]+ap*j);
  57. if (st<ed) f[i][j]=max(f[i][j],q[st].y-ap*j);
  58. }
  59. st=ed=;
  60. D(j,m,){
  61. while(st<ed && q[st].x>j+bs) st++;
  62. while(st<ed && q[ed-].y<=f[k][j]+bp*j) ed--;
  63. q[ed++]=node(j,f[k][j]+bp*j);
  64. if (st<ed) f[i][j]=max(f[i][j],q[st].y-bp*j);
  65. }
  66. }
  67. ans=max(ans,f[i][]);
  68. }
  69. printf("%d\n",ans);
  70. return ;
  71. }

【BZOJ】【1855】【SCOI2010】/【HDOJ】【3401】股票交易的更多相关文章

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

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

  2. bzoj 1855: [Scoi2010]股票交易

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  3. BZOJ 1855 [Scoi2010]股票交易 ——动态规划

    DP方程是比较简单的,主要有三种:什么都不做.买入.卖出. 发现买入卖出都是$\Theta (n^3)$但是转移方程都是线性的,而且决策和当前的情况是分开的. 所以可以单调队列优化. 复杂度$\The ...

  4. BZOJ 1855: [Scoi2010]股票交易(DP+单调队列)

    1855: [Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未 ...

  5. 1855: [Scoi2010]股票交易[单调队列优化DP]

    1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1083  Solved: 519[Submit][Status] ...

  6. [BZOJ 1855] 股票交易

    Link: BZOJ 1855 传送门 Solution: 比较明显的$dp$模型 令$dp[i][j]$为第$i$天持有$j$支股票时的最大利润 对其购买股票和售出股票分别$dp$,这里以购买为例: ...

  7. BZOJ 1857: [Scoi2010]传送带

    二次联通门 : BZOJ 1857: [Scoi2010]传送带 /* BZOJ 1857: [Scoi2010]传送带 三分套三分 可能是吧..dalao们都说明显是一个单峰函数 可是我证不出来.. ...

  8. (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作

    二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...

  9. 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569

    题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ...

  10. BZOJ 1855 股票交易(单调队列优化DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1855 题意:最近lxhgww又迷上了投资股票, 通过一段时间的观察和学习,他总结出了股票 ...

随机推荐

  1. (转)浅谈HTML5与css3画饼图!

    神马系饼图? 饼图,大家都应该熟知,在统计数据对比方面,几乎处处用到.如cnzz的统计饼图 从饼图中,很形象地展示了访问者地区的分布,以扇形为块的方式拼成一个大圆. 都使用什么方法实现 目前众多站点制 ...

  2. VS2012那点事儿

    VS2012并不完美支持C99标准,这一点强烈的体现在如下的错误: 也就是是说你的变量定义必须在前面,一股脑儿全写完,然后才可以使用,如果你定义变量穿插在了其他地方,那么就会报上面的错误.略微有些遗憾 ...

  3. DevExpress XtraGrid 数据导出导入Excel

    // <summary> /// 导出按钮 /// </summary> /// <param name="sender"></param ...

  4. How to get the underlying SSRS Report Query, reset query , add your own ranges and execute report [AX2012]

    Below is the small code snippet to get the underlying query of the SSRS report, reset query, prompt ...

  5. Linux获取用户主目录

    #!/usr/bin/python# -*- coding:utf-8 -*-import sysimport osclass get_home_path(object): def __init__( ...

  6. 实战Django:官方实例Part2

    我们接着Part1部分往下讲.我们在part1中启动服务器后,并没有在管理页面中发现新添加的Polls应用,怎么办捏? 7.在管理界面中显示Question 只要注册一下这个应用就可以了.编辑poll ...

  7. hdu 5166 Missing number

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5166 Missing number Description There is a permutatio ...

  8. Object C学习初步

    最近乘着项目不太紧张的时候,赶紧给自己冲了一下电.其实我自己最熟悉的平台应该是.net,所以当初上手windows phone的话是很快,我记得当初是一边跟着项目进展,一边自己开始学习前台的XAML语 ...

  9. Java日期处理类的lenient属性

    这个特性很坑爹:@Test public void test() throws ParseException { SimpleDateFormat df = new SimpleDateFormat( ...

  10. GHOST -ntexact 正常还原

    我常常用PE启动电脑,用PE下的GHOST软件恢复备份的系统,但最近恢复WIN10备份时出了问题,出现25002错误,恢复其他备份正常,原因不明 解决办法是在PE中运行CMD,启动DOS,然后进入GH ...