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 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...
随机推荐
- runc create container 流程分析
1.// runc/create.go Action: func(context *cli.Context) error 首先调用spec, err := setupSpec(context)加载配置 ...
- 集合框架学习笔记<二>
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- C# 读取Excel
直接添代码: public void connExcel(string strPath) { //string strConn = @"Provider=Microsoft.Jet.OLED ...
- MongoDB学习(四)客户端工具备份数据库
在上一篇MongoDB学习(三)中讲解了如何在服务器端进行数据的导入导出与备份恢复,本篇介绍下如何利用客户端工具来进行远程服务器的数据备份到本地. 以客户端工具MongoVUE为例来进行讲解: 1.首 ...
- JAVA NIO概述(一):I/O模型
NIO是jdk1.4加入的新功能,我们一般成为非阻塞IO,在1.4之前,JAVA中的都是BIO(堵塞IO),BIO有以下几个缺点: 没有数据缓冲区,I/O性能存在问题 没有C/C++中channel( ...
- cotangent Laplacian
几何网格处理经常用到 cotangent laplacian矩阵.前几天把这个功能整合到我的Maya 转 Matlab插件了. 这里发一个利用cotangent laplacian计算特征向量并显示的 ...
- mysql数据库误删除后的数据恢复操作说明
在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失!然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据库给删除了,怎么办 ...
- html2canvas手机端模糊问题
待解决.测试对于图片之类的没有影响.但是文字在手机上看起来比较模糊.
- f2fs解析(五)什么叫做compacted summary
f2fs中普通的summary是长这样的:每一个段的SSA block中,前半部分是这个段的SSA,然后对于HOT_DATA以及COLD_DATA段,存放是的是nat journal 和 sit jo ...
- 10SpringMvc_springmvc快速入门小案例(注解版本)
第一步:新建案例工程: