HDU 3401 Trade dp+单调队列优化
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3401
Trade
Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)
#### 问题描述
> Recently, lxhgww is addicted to stock, he finds some regular patterns after a few days' study.
> 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?
输入
The first line is an integer t, the case number.
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.
输出
The most money lxhgww can earn.
样例输入
1
5 2 0
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1
样例输出
3
题意
一个人,一开始有无数的钱和0张股票,接下来的t天里,在第i天,他能够选择以api的价格买进一张股票,且最多允许买asi张;或者以bpi的价格卖出股票,且最多卖出bpi张。任何时刻手头的股票不能超过maxp张,且任意两次交易需要隔至少w天。问最多能赚多少钱。
题解
dp[i][j]表示第i天持有j张股票。
则易知:dp[i][j]=max{dp[i-1][j],dp[i-w-1][k]-(j-k)*api(买入),dp[i-w-1][k]+(k-j)*bpi)(卖出)}
因为当j固定时只需找出max{dp[i-w-1][k]+k*api(或者bpi)},由于有asi(或者bsi)的限制,所以需要用单调队列来维护一下(否则只需要维护一个最大值就ok了)。所以复杂度是O^2。
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=2222;
int n,maxp,w;
int ap[maxn],bp[maxn],as[maxn],bs[maxn];
///dp[i][j]表示第i天持j张股票
int dp[maxn][maxn];
///单调队列
PII que[maxn];
int main() {
int tc;
scf("%d",&tc);
while(tc--){
scf("%d%d%d",&n,&maxp,&w);
for(int i=0;i<n;i++){
scf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);
}
///初始化
for(int i=0;i<n;i++){
for(int j=0;j<=maxp;j++){
dp[i][j]=-INF;
}
}
for(int j=0;j<=min(maxp,as[0]);j++){
dp[0][j]=-ap[0]*j;
}
for(int i=1;i<n;i++){
///第i天不进行交易
for(int j=0;j<=maxp;j++){
dp[i][j]=dp[i-1][j];
}
///第i天进行交易
if(i-w-1<0){
for(int j=0;j<=min(maxp,as[i]);j++){
dp[i][j]=max(dp[i][j],-ap[i]*j);
}
continue;
}
///买入
int f=1,r=1;
for(int j=0;j<=maxp;j++){
int x=dp[i-w-1][j]+ap[i]*j;
while(f<r&&que[r-1].X<x) r--;
que[r++]=mkp(x,j);
while(f<r&&que[f].Y+as[i]<j) f++;
dp[i][j]=max(dp[i][j],que[f].X-j*ap[i]);
}
///卖出
f=r=1;
for(int j=maxp;j>=0;j--){
int x=dp[i-w-1][j]+bp[i]*j;
while(f<r&&que[r-1].X<x) r--;
que[r++]=mkp(x,j);
while(f<r&&que[f].Y-bs[i]>j) f++;
dp[i][j]=max(dp[i][j],que[f].X-j*bp[i]);
}
}
int ans=0;
for(int i=0;i<=maxp;i++){
ans=max(ans,dp[n-1][i]);
}
prf("%d\n",ans);
}
return 0;
}
//end-----------------------------------------------------------------------
HDU 3401 Trade dp+单调队列优化的更多相关文章
- 【HDU 3401 Trade】 单调队列优化dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 题目大意:现在要你去炒股,给你每天的开盘价值,每股买入价值为ap,卖出价值为bp,每天最多买as ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)
这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...
- P3084 [USACO13OPEN]照片Photo (dp+单调队列优化)
题目链接:传送门 题目: 题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows ( ...
- Codeforces 445A Boredom(DP+单调队列优化)
题目链接:http://codeforces.com/problemset/problem/455/A 题目大意:有n个数,每次可以选择删除一个值为x的数,然后值为x-1,x+1的数也都会被删除,你可 ...
- bzoj 1855 dp + 单调队列优化
思路:很容易写出dp方程,很容易看出能用单调队列优化.. #include<bits/stdc++.h> #define LL long long #define fi first #de ...
- 股票交易(DP+单调队列优化)
题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi, ...
- Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)
题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...
随机推荐
- Hive remote install mode (mysql) step by step
Prerequisite: Hadoop cluster is avalable; Mysql installed on namenode; Step1: download the latest hi ...
- 1.素数判定(如何输出\n,\t,不用关键字冲突)
题目描述 Description 质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数. 素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也 ...
- Jetson TK1刷机+配置Mini PCI-e无线网卡
最近买了台4K电视,觉得可以当显示器用,但没主机,不知怎的想到了Jetson TK1,于是一冲动买了.因为没网线,而Jetson TK1没有无线网卡,所以也折腾了一番,记录一下,给万一也有像我一样没有 ...
- 2014 Super Training #10 C Shadow --SPFA/随便搞/DFS
原题: FZU 2169 http://acm.fzu.edu.cn/problem.php?pid=2169 这题貌似有两种解法,DFS和SPFA,但是DFS怎么都RE,SPFA也要用邻接表表示边, ...
- HDU 3667 费用流(拆边)
题意:有n个城市(1~n),m条有向边:有k件货物要从1运到n,每条边最多能运c件货物,每条边有一个危险系数ai,经过这条路的费用需要ai*x2(x为货物的数量),问所有货物安全到达的费用. 思路:c ...
- Linux环境安装Jenkins
安装环境: CenOS 6.4 JDK_1.6.0_23 一.安装前检查环境 检查是否安装JDK: java --version 二.安装Jenkins 1. 添加Jenkins的源(reposito ...
- java 14-2 正则表达式的案例
1.判断功能 String类的public boolean matches(String regex) 需求: 判断手机号码是否满足要求? 分析: A:键盘录入手机号码 B:定义手机号码的规则 136 ...
- CLR的执行模型
1,将源代码编译成托管代码.源代码如C#,VB,F#2,将托管代码合并成程序集.3,加载公共语言运行时.4,执行程序集的代码.
- MVC4项目中验证用户登录一个特性就搞定
在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问. [AttributeUsage(Attribu ...
- C#报错:创建调试信息文件 ……obj\Debug\model.pdb: 拒绝访问
错误:创建调试信息文件“.......\obj\Debug\model.pdb”时发生错误 --“......\obj\Debug\model.pdb: 拒绝访问. 解决办法如下: 删除该项目下的 b ...