hdu 3401 单调队列优化DP
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
He forecasts the next T days' stock market. On the i'th day, you can buy one stock with the price APi or sell one stock to get BPi.
There are some other limits, one can buy at most ASi stocks on the i'th day and at most sell BSi stocks.
Two trading days should have a interval of more than W days. That is to say, suppose you traded (any buy or sell stocks is regarded as a trade)on the i'th day, the next trading day must be on the (i+W+1)th day or later.
What's more, one can own no more than MaxP stocks at any time.
Before the first day, lxhgww already has infinitely money but no stocks, of course he wants to earn as much money as possible from the stock market. So the question comes, how much at most can he earn?
Input
The first line of each case are three integers T , MaxP , W .
(0 <= W < T <= 2000, 1 <= MaxP <= 2000) .
The next T lines each has four integers APi,BPi,ASi,BSi( 1<=BPi<=APi<=1000,1<=ASi,BSi<=MaxP), which are mentioned above.
Output
Sample Input
Sample Output
/*
* Author: sweat123
* Created Time: 2016/7/12 13:52:38
* File Name: main.cpp
*/
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<string>
#include<vector>
#include<cstdio>
#include<time.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1<<30
#define MOD 1000000007
#define ll long long
#define lson l,m,rt<<1
#define key_value ch[ch[root][1]][0]
#define rson m+1,r,rt<<1|1
#define pi acos(-1.0)
using namespace std;
const int MAXN = ;
struct node{
int num;
int val;
node(int tnum = ,int tval = ):num(tnum),val(tval){}
};
deque<node>q;
int dp[MAXN][MAXN],T,MaxP,W;
int AP[MAXN],BP[MAXN],AS[MAXN],BS[MAXN];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&T,&MaxP,&W);
for(int i = ; i <= T; i++){
scanf("%d%d%d%d",&AP[i],&BP[i],&AS[i],&BS[i]);
}
for(int i = ; i <= T; i++){
for(int j = ; j <= MaxP; j++){
dp[i][j] = -INF;
}
}
for(int i = ; i <= W+; i++){//第一天到W+1天只都是只能买的
for(int j = ; j <= min(MaxP,AS[i]); j++){
dp[i][j] = - AP[i] * j;
}
}
dp[][] = ;
for(int i = ; i <= T; i++){
for(int j = ; j <= MaxP; j++){//什么都不做
dp[i][j] = max(dp[i-][j],dp[i][j]);
}
if(i <= W + )continue;//已经预处理了
q.clear();
int bf = i - W - ;//队列中保存i - W - 1天的信息
for(int j = ; j <= MaxP; j++){//有多少股票
int nowf = dp[bf][j] + j * AP[i];//队列维护这个最大值
while(!q.empty() && q.back().val < nowf){
q.pop_back();
}
q.push_back(node(j,nowf));
while(!q.empty() && j - q.front().num > AS[i]){//队列里面存的都是i - W - 1天的信息 对于第i天
//如果第i天的股票数 - (i - W - 1)天的股票数大于今天能买的数,那就不符合
q.pop_front();
}
dp[i][j] = max(dp[i][j],q.front().val - j * AP[i]);
}
q.clear();
for(int j = MaxP; j >= ; j--){
int nowf = dp[bf][j] + j * BP[i];
while(!q.empty() && q.back().val < nowf){
q.pop_back();
}
q.push_back(node(j,nowf));
while(!q.empty() && q.front().num - j > BS[i]){
q.pop_front();
}
dp[i][j] = max(dp[i][j],q.front().val - j * BP[i]);
}
}
int ans = ;
for(int i = ; i <= MaxP; i++){
ans = max(ans,dp[T][i]);
}
printf("%d\n",ans);
}
return ;
}
hdu 3401 单调队列优化DP的更多相关文章
- hdu 3401 单调队列优化+dp
http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others) Memor ...
- 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】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 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- 单调队列优化DP——习题收集
前言 感觉可以用单调队列优化dp的模型还是挺活的,开个随笔记录一些遇到的比较有代表性的模型,断续更新.主要做一个收集整理总结工作. 记录 0x01 POJ - 1821 Fence,比较适合入门的题, ...
- Parade(单调队列优化dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
随机推荐
- IOS开发基础知识--碎片10
1:如何给表格单元列增加选择时的背影效果 if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCel ...
- CSS3-04 样式 3
前言 关于 HTML/CSS 的博客也写了几篇了.该系列博客主要介绍 HTML 和 CSS 的基础,尚未过多的涉及 HTML5 和 CSS3 (即 HTML/CSS 进阶)的内容.这些博客是按照一定的 ...
- WebLogic: console 启动慢解决办法
找到WebLogic使用的JDK目录. 修改java_home/jre/lib/security/java.security文件: 将seucrerandom.source=file:/dev/ura ...
- 【hive】——Hive初始了解
1.没有接触,不知道这个事物是什么,所以不会产生任何问题.2.接触了,但是不知道他是什么,反正我每天都在用.3.有一定的了解,不够透彻.那么hive,1.我们对它了解多少?2.它到底是什么?3.hiv ...
- CocoaPods报错:The dependency `AFNetworking ` is not used in any concrete target
最近更新了下cocoapods,今天再pod update 就遇到这个错误: 大体意思就是说,库没有用到指定的target. 找了下资料,发现是新版CocoaPods在 Podfile里使用时,必须 ...
- Python安装
Win10 安装Python 1.官网下载Python安装包,一直点击下一步进行安装 安装完Python后要设置环境变量,右键我的电脑-->属性-->高级系统设置-->环境变量--& ...
- php函数 ceil floor round和 intval
1.ceil 如果有小数部分 则进一位 < ?php echo ceil(4.3); echo ceil(9.999); ?> 2.floor 舍小取整 < ? php echo f ...
- 项目开发之UML之初识
- 【小白的CFD之旅】12 敲门实例【续2】
接上文[小白的CFD之旅]敲门实例[续] 主要内容 3 Solution3.1 Solution Methods3.2 Solution Controls3.3 Monitors3.4 Report ...
- 2016.10.29 清北学堂NOIP冲刺班Day1 AM 考试总结
成绩:满分300,我得了200, 1:90//前两个题目都是模拟,没用到什么其他算法,第一题有可能少考虑了一点细节 2:100 3:10//感觉是个DP,但是毫无思路,只打了个普通背包,10分而已. ...