hdu 3401 单调队列优化动态规划
思路:
动态方程很容易想到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的转移最大值。即从哪个容量转移过来能得到最大效益。
见代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 10000010
#define Maxn 2010
#define Min(a,b) (a)>(b)?(b):(a)
using namespace std;
int dp[Maxn][Maxn],as[Maxn],bs[Maxn],ap[Maxn],bp[Maxn];
struct Que{
int val,pos;
}que[];
int main()
{
int n,t,p,w,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&p,&w);
for(i=;i<=n;i++)
for(j=;j<=p;j++)
dp[i][j]=-inf;//初始化
for(i=;i<=n;i++)
scanf("%d%d%d%d",ap+i,bp+i,as+i,bs+i);
for(i=;i<=w+;i++)//预处理
for(j=;j<=as[i];j++)
dp[i][j]=-j*ap[i];
for(i=;i<=n;i++)
{
for(j=;j<=p;j++)
dp[i][j]=max(dp[i][j],dp[i-][j]);//预处理
if(i<=w+) continue;
int head=,rear=;
for(j=;j<=p;j++)//买石头
{
while(head<=rear&&(que[rear].val-(j-que[rear].pos)*ap[i])<=dp[i-w-][j])
rear--;
que[++rear].pos=j,que[rear].val=dp[i-w-][j];
if(que[head].pos<j-as[i]) head++;
dp[i][j]=max(dp[i][j],que[head].val+(que[head].pos-j)*ap[i]);
}
head=,rear=;
for(j=p;j>=;j--)//卖石头
{
while(head<=rear&&(que[rear].val+(que[rear].pos-j)*bp[i])<=dp[i-w-][j])
rear--;
que[++rear].pos=j,que[rear].val=dp[i-w-][j];
if(que[head].pos>j+bs[i]) head++;
dp[i][j]=max(dp[i][j],que[head].val+(que[head].pos-j)*bp[i]);
}
}
int Max=;
for(i=;i<=p;i++)//找出最大效益
if(dp[n][i]>Max)
Max=dp[n][i];
printf("%d\n",Max);
}
return ;
}
hdu 3401 单调队列优化动态规划的更多相关文章
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu 3401 单调队列优化+dp
http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others) Memor ...
- hdu 4374 单调队列优化动态规划
思路:我只想说,while(head<=rear&&que[rear].val+sum[j]-sum[que[rear].pos-1]<=dp[i-1][j]+num[i- ...
- HDU 2191 - 单调队列优化多重背包
题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...
- poj 3017 单调队列优化动态规划
思路:dp[i]=min{dp[j]+max(num[j+1]...num[i])},其中sum[i]-sum[j]<=m. 那么我们需要用单调队列维护j到i的最大值. #include< ...
- 【单调队列优化dp】HDU 3401 Trade
http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...
- 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 ...
- HDU 3507 单调队列 斜率优化
斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...
- Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)
题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...
随机推荐
- 修改eclipse默认编码方式
设置js文件的默认编码格式为UTF-8 在Windows->Preference页面中,选择General->Content Types ...
- poj3259
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24864 Accepted: 8869 Descri ...
- ModelMap和ModelAndView
一.ModelMap和ModelAndView 1.1.ModelMap ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可, ...
- jquery formValidate demo 采用struts 异步方式检验用户名是否存在
1 login.jsp <%@taglib uri="/struts-tags" prefix="s"%><!DOCTYPE html PUB ...
- MongoDB 快速入门--高级
引用 --------->DBRefs DBRef的形式: { $ref : , $id : , $db : } $ref:集合名称 $id:引用的id $db:数据库名称,可选参数 { &qu ...
- Win7激活后添加grub引导Linux最简单方法
因为Win7(Vista同理)的激活方式是通过grub摸你OEM的Slic信息,所以主引导分区MBR被这个grub占用,以此才能激活WIn7.但是如果想同时安装Linux在别的分区,就会产生问题:gr ...
- hdu 5587 Array 数学题
Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5587 De ...
- Codeforces Gym 100513F F. Ilya Muromets 线段树
F. Ilya Muromets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513/probl ...
- QProcess调用外部程序方式的差异
众所周知QProcess类的作用是启动一个外部的程序并与之交互它有三种方式调用外部程序: 1. execute 2. start 3. startDetached 从调用上看: execute是阻塞调 ...
- JAVA static 作用
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...