思路:

动态方程很容易想到dp[i][j]=max(dp[i][j],dp[i-w-1][j-k]-k*ap[i],dp[i-w-1][j+k]+k*bp[i]);

dp[i][j]表示第i天拥有j个石头的最大价值。

其实每次求得都是最有策略,所有dp[i-w-1]表示的就是i-w-1以前的最优,故不同往前遍历。

那么主要需要优化的是:

对于买石头,容量为j时,维护从j-k到j的转移最大值。即从哪个容量转移过来能得到最大效益。

对于卖石头,容量为j时,维护从j+k到j的转移最大值。即从哪个容量转移过来能得到最大效益。

见代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define inf 10000010
  7. #define Maxn 2010
  8. #define Min(a,b) (a)>(b)?(b):(a)
  9. using namespace std;
  10. int dp[Maxn][Maxn],as[Maxn],bs[Maxn],ap[Maxn],bp[Maxn];
  11. struct Que{
  12. int val,pos;
  13. }que[];
  14. int main()
  15. {
  16. int n,t,p,w,i,j,k;
  17. scanf("%d",&t);
  18. while(t--)
  19. {
  20. scanf("%d%d%d",&n,&p,&w);
  21. for(i=;i<=n;i++)
  22. for(j=;j<=p;j++)
  23. dp[i][j]=-inf;//初始化
  24. for(i=;i<=n;i++)
  25. scanf("%d%d%d%d",ap+i,bp+i,as+i,bs+i);
  26. for(i=;i<=w+;i++)//预处理
  27. for(j=;j<=as[i];j++)
  28. dp[i][j]=-j*ap[i];
  29. for(i=;i<=n;i++)
  30. {
  31. for(j=;j<=p;j++)
  32. dp[i][j]=max(dp[i][j],dp[i-][j]);//预处理
  33. if(i<=w+) continue;
  34. int head=,rear=;
  35. for(j=;j<=p;j++)//买石头
  36. {
  37. while(head<=rear&&(que[rear].val-(j-que[rear].pos)*ap[i])<=dp[i-w-][j])
  38. rear--;
  39. que[++rear].pos=j,que[rear].val=dp[i-w-][j];
  40. if(que[head].pos<j-as[i]) head++;
  41. dp[i][j]=max(dp[i][j],que[head].val+(que[head].pos-j)*ap[i]);
  42. }
  43. head=,rear=;
  44. for(j=p;j>=;j--)//卖石头
  45. {
  46. while(head<=rear&&(que[rear].val+(que[rear].pos-j)*bp[i])<=dp[i-w-][j])
  47. rear--;
  48. que[++rear].pos=j,que[rear].val=dp[i-w-][j];
  49. if(que[head].pos>j+bs[i]) head++;
  50. dp[i][j]=max(dp[i][j],que[head].val+(que[head].pos-j)*bp[i]);
  51. }
  52. }
  53. int Max=;
  54. for(i=;i<=p;i++)//找出最大效益
  55. if(dp[n][i]>Max)
  56. Max=dp[n][i];
  57. printf("%d\n",Max);
  58. }
  59. return ;
  60. }

hdu 3401 单调队列优化动态规划的更多相关文章

  1. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  2. hdu 3401 单调队列优化+dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  3. hdu 4374 单调队列优化动态规划

    思路:我只想说,while(head<=rear&&que[rear].val+sum[j]-sum[que[rear].pos-1]<=dp[i-1][j]+num[i- ...

  4. HDU 2191 - 单调队列优化多重背包

    题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...

  5. poj 3017 单调队列优化动态规划

    思路:dp[i]=min{dp[j]+max(num[j+1]...num[i])},其中sum[i]-sum[j]<=m. 那么我们需要用单调队列维护j到i的最大值. #include< ...

  6. 【单调队列优化dp】HDU 3401 Trade

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...

  7. bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401

    这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...

  8. HDU 3507 单调队列 斜率优化

    斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...

  9. Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)

    题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...

随机推荐

  1. Java设计模式系列之适配器模式

    适配器模式的定义 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.(就类似于我们充电器的转接头将220V的电压转换成我们的手机端 ...

  2. C#Windows窗体界面设计_01_绘制三角函数_五点作图法

    binzhouweichao@163.com Visual Stutio 2010 C#开发环境 五点作图绘制三角函数,以正弦函数为例,选取一个周期[0, 2π]上的五个特殊的点,也就是横坐标0, π ...

  3. UVaLive 6628 Grachten (水题,数学)

    题意:给定一个平面图形并且且给了几条连,求一条. 析:简单么,三角形相似,很简单就AC. 代码如下: #pragma comment(linker, "/STACK:1024000000,1 ...

  4. AOV网络拓扑排序

    这个算法,主要是为输出一个无环图的拓扑序列 算法思想: 主要依赖一个栈,用来存放没有入度的节点,每次读取栈顶元素,并将栈顶元素的后继节点入度减一,如果再次出现入度为零的节点,就加入到栈中.参考< ...

  5. oracle中extents存在的理由

    extents的特性:1:一个extent由相连的多个blocks组成,多个extents组成一个segment,2:oracle在为segment分配空间时,是以extent为单位因此extents ...

  6. OAuth 2.0

    国外 OAuth2.0 大全:http://oauth.net/2/ 国内经典:http://www.fising.cn/2011/03/%E4%B8%80%E6%AD%A5%E4%B8%80%E6% ...

  7. NEUOJ 1117: Ready to declare(单调队列)

    1117: Ready to declare 时间限制: 1 Sec  内存限制: 128 MB 提交: 358  解决: 41 [提交][状态][pid=1117" style=" ...

  8. C# 强制关闭当前程序进程(完全Kill掉不留痕迹)

    C# 强制关闭当前程序进程(完全Kill掉不留痕迹) /// <summary> /// 运行DOS命令 /// DOS关闭进程命令(ntsd -c q -p PID )PID为进程的ID ...

  9. 不可不表的OSG智能指针之强指针与弱指针 《转载》

    不可不表的OSG智能指针之强指针与弱指针 <转载> 使用OSG的人都知道OSG的内存管理方式采用了智能指针,通过智能指针的方式让OSG自己处理对象的销毁工作.在OSG中有两个智能指针类型, ...

  10. Jquery中$与$.fn的差别

    当今web开发往往离不开Jquery的使用,Jquery以其简洁的使用方式.良好的浏览器兼容性赢得了软件研发同行的青睐,作为当中的一员,自然也不例外,虽然刚開始时非常排斥Jquery,今天我谈一下对J ...