bzoj1855
让我们继续练习dp
首先这道题约束条件很多
但实际上方程还是很好写的,f[i,j]表示第i天时拥有j只股票的最大收益
令p=max(0,i-k-1) 上一次较交易
易得f[i,j]=max(f[i-1,j],f[p,j-b]-ap[i]*b,f[p,j+s]+bp[i]*s) b<=as[i],s<=bs[i];
显然会TLE,我们要优化
f[i-1,j]我们可以先不管他,
我们令j1=j-b j2=j+s
则max(0,j-as[i])<=j1<=j
j<=j2<=min(m,j+bs[i]);
则原式可化为
f[i,j]=max(f[p,j1]+ap[i]*j1-ap[i]*j,f[p,j2]+bp[i]*j2-bp[i]*j)
观察得知对于当前的状态,结果只与j1,j2有关系
于是我们可以分开来对j1,j2求区间最大,再求一个总的最大就行
对此我们可以用线段树
但是,线段树算法O(n^2logn)而且实际常数较大,会TLE(一开始我就是这样)
观察区间其实总是整体右移的,这很像我一开始做的单调队列的滚动窗口那道题
于是我们可以用单调队列优化
加入只考虑买入的情况对于k1<k2
如果有f[p,k2]+ap[i]*k2>=f[p,k2]+ap[i]*k2 那么k2一定比k1优(更可能成为区间最大)
卖出情况同理,因此我们从0~m遍历一边,维护一个单调减的队列就行了
每个点最多出队一次,入队一次
因此复杂度为O(n^2);
const inf=-;
var q,b,s,ns,nb,vs,vb:array[..] of longint;
f:array[..,..] of longint;
l,ans,h,t,p,i,j,k,n,m:longint; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; function compareb(x,y:longint):boolean;
begin
if f[p,x]+vb[i]*x>=f[p,y]+vb[i]*y then exit(true) else exit(false);
end; function compares(x,y:longint):boolean;
begin
if f[p,x]+vs[i]*x>=f[p,y]+vs[i]*y then exit(true) else exit(false);
end; begin
readln(n,m,k);
for i:= to n do
readln(vb[i],vs[i],nb[i],ns[i]);
for i:= to m do
f[,i]:=inf;
f[,]:=;
for i:= to n do
begin
p:=max(i-k-,);
h:=;
t:=;
q[]:=;
for j:= to m do //买入情况
begin
if j<> then
begin
while (h<t) and compareb(j,q[t]) do dec(t);
inc(t);
q[t]:=j;
end;
l:=max(,j-nb[i]);
while (q[h]<l) do inc(h);
while (h<t) and compareb(q[h+],q[h]) do inc(h);
b[j]:=f[p,q[h]]+vb[i]*q[h];
end;
h:=;
t:=;
q[]:=m;
for j:=m downto do //卖出情况
begin
if j<>m then
begin
while (h<t) and compares(j,q[t]) do dec(t);
inc(t);
q[t]:=j;
end;
l:=j+ns[i];
if l>m then l:=m;
while (q[h]>l) do inc(h);
while (h<t) and compares(q[h+],q[h]) do inc(h);
s[j]:=f[p,q[h]]+vs[i]*q[h];
end;
for j:= to m do //求总的最大
f[i,j]:=max(f[i-,j],max(b[j]-vb[i]*j,s[j]-vs[i]*j));
end;
ans:=f[n,]; //显然手上无股票最合算
writeln(ans);
end.
bzoj1855的更多相关文章
- 【BZOJ1855】股票交易(动态规划,单调队列)
[BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最 ...
- 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP
上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...
- 【BZOJ1855】[Scoi2010]股票交易 DP+单调队列
[BZOJ1855][Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预 ...
- BZOJ1855 [Scoi2010]股票交易 【单调队列优化dp】
题目链接 BZOJ1855 题解 设\(f[i][j]\)表示第\(i\)天结束时拥有\(j\)张股票时的最大收益 若\(i \le W\),显然在这之前不可能有交易 \[f[i][j] = max\ ...
- [bzoj1855][Scoi2010]股票交易_动态规划_单调队列
股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ...
- 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 ...
- bzoj1855: [Scoi2010]股票交易
Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...
- BZOJ1855或洛谷2569 [SCOI2010]股票交易
一道单调队列优化\(DP\) BZOJ原题链接 洛谷原题链接 朴素的\(DP\)方程并不难想. 定义\(f[i][j]\)表示到第\(i\)天,手上持有\(j\)股时的最大收益. 转移方程可以分成四个 ...
- BZOJ1855 股票交易 单调队列优化 DP
描述 某位蒟佬要买股票, 他神奇地能够预测接下来 T 天的 每天的股票购买价格 ap, 股票出售价格 bp, 以及某日购买股票的上限 as, 某日出售股票上限 bs, 并且每次股票交 ♂ 易 ( 购 ...
随机推荐
- python字典根据value排序
参考: http://docs.python.org/2/howto/sorting.html http://www.cnpythoner.com/post/266.html http://ghost ...
- asp.net web form中 用attribute实现权限验证方式
以前项目的代码比较陈旧,今天抽空优化了一下.作为记录. 以前每次请求一个方法都要验证是否登录 if xxx等 现在通过global文件中的改进 反射这个方法的属性是否需要权限 要的话先验证权限.以下 ...
- 【原创】一起学C++ 之指针、数组、指针算术 ---------C++ primer plus(第6版)
C++ Primer Plus 第6版 指针和数组基本等价的原因在于指针算术! 一.指针 ⑴整数变量+1后,其值将增加1: ⑵指针变量+1后,增加的量等于它指向的类型的字节数: ⑶C++将数组名解析为 ...
- C#网络编程(1)
1.Purpose 1.什么是网络编程 2.TCP/IP协议 3.什么是套接字 4.多线程深入理解 二.Basic Concept 1.网络编程:主要实现进程(线程)相互之间的通信和基本的网络应用原理 ...
- 【go】脑补框架 Express beego tornado Flux reFlux React jsx jpg-ios出品
http://goexpresstravel.com/ 今天 Express 的作者 TJ Holowaychuk 发了一篇文章,正式宣告和 Node.js 拜拜了,转向 Go 语言. Go vers ...
- MySQL与Oracle主键Query性能测试结果
测试结果总结如下: 1. 按主键读:SQL形式:SELECT * FROM table WHERE id=?. 1.1. 主键为数字.如果所有ID均不存在,纯比较SQL解析能力.MySQL解析SQL的 ...
- jquery easyui无法绑定下拉框内容
最近在研究jquery easyui的DataGrid,发现DataGrid中的下拉框无法绑定值,找了很久也没发现是具体问题所在,最后还是同事帮忙搞定的.具体问题竟然是jquery easyui提供的 ...
- Contest2037 - CSU Monthly 2013 Oct (problem B :Scoop water)
http://acm.csu.edu.cn/OnlineJudge/problem.php?cid=2037&pid=1 [题解]:卡特兰数取模 h(n) = h(n-1)*(4*n-2)/( ...
- First Groovy
class Sample { def names = ["anna", "annie", "tommy", "bobby" ...
- java小提示:标示符常见命名规则、常用ASCII
标示符常见命名规则: A:包:全部小写B:类或者接口:首字母大写:StudentC:方法或者接口:首字母小写,第二个单词开始开始,每个单词首字母大写:studentAgeD:常量:全部大写,多个单词之 ...