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 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...
随机推荐
- UVALive 7274 Canvas Painting (优先队列)
Canvas Painting 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/C Description http://7xjo ...
- HDU 5816 Hearthstone (状压DP)
Hearthstone 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an onlin ...
- zoj 1610 Count the Colors
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=610 Count the Colors Time Limit:2000MS ...
- codeforces 630J Divisibility
J. Divisibility time limit per test 0.5 seconds memory limit per test 64 megabytes input standard in ...
- 嵌入式LINUX入门到实践(一)
MINI2440 IIC协议 IIC协议在工程中应用广泛,在我看来,此协议的优势就在于其硬件及其简单,结构清晰. 首先来解读一下S3C2440A这款芯片的IIC协议. 一.一个协议的解读从如上结构图中 ...
- Linux定时执行任务命令概述:at和crontab
本文介绍在Linux下的两种定时执行任务的方法:at命令,以及crontab服务. (1)at命令 假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了. 设置at命令很简单,指示定 ...
- opencv 模板匹配与滑动窗口(单匹配) (多匹配)
1单匹配: 测试图片: code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <open ...
- 绑定线程到特定CPU处理器
参考这篇文章 http://blog.chinaunix.net/uid-27761170-id-5050258.html 代码如下: #define _GNU_SOURCE #include < ...
- java.util.Arrays的使用
在Java.util包中有一个工具类Arrays类,封装了一些操作数组的方法.简单使用如下: package com.arrays.test; import java.util.Arrays; pub ...
- nodejs小问题:[1]express不是内部或外部命令
nodejs小问题:[1]express不是内部或外部命令 浏览:9424 | 更新:2015-08-28 05:31 1 2 3 4 5 6 7 分步阅读 一时兴起想学习点东西,准备在heroku上 ...