→BZOJ任意门←

很显然的动态规划题(笑)

容易想到DP的数组 f[i][j] 表示第i天手上有j股股票时能赚到最多的钱。

接下来就是转移了,有这么多变量一定要看清楚,仔细地分情况讨论。

每次转移时一共有四种情况:

(先从简单的入手)

一、第i天不买股票也不买

那就是从前一天相同的股票值更新过来

f[i][j]=max(f[i][j],f[i-1][j]);

那为什么是前一天而不是前几天呢?因为前几天的最优值都已经更新到前一天了呀。

二、第i天凭空买股票(相当于从之前手持0股票的情况更新来)

其实就是第i天的DP数组的初始化

For(j,0,As[i]) f[i] [j]=-1 * j * Ap[i];

三、第i天在第 i-w-1 天的基础上买股票

那我们设第i-w-1天的股票数为k,最直接的更新就是下面这样

f[i][j]=max(f[i][j], f[i-w-1][k]-(j-k)* Ap[i]);

但我们此时要更新的是j,所以可以稍稍转化一下:

  f[i][j]=max{ f[i-w-1][k]+k*Ap[i] } - j* Ap[i]

那么此时k的范围是多少呢 不难想到就是 [ j-As[i], j)

所以在k的取值范围上,有经验的OIer们应该都能想到单调队列了吧(!)

式子中有取max值,还有取值范围的经常都是用单调队列来优化(不知道具体如何操作的可以看代码)

四、第i天在第i-w-1天的基础上卖出股票

和上一种情况其实是一样的(式子的推导请参照上式自己操作)

f[i][j]=max{f[i-w-1][k]+k*Bp[i]}- j* Ap[i]

只是k的取值范围不一样了,变成了(j, j+Bs[i] ]

同样可以用单调队列来优化。

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> #define For(i,a,b) for(register int i=a;i<=b;++i)
#define Dwn(i,a,b) for(register int i=a;i>=b;--i)
#define Re register using namespace std; const int N=2e3+;
int f[N][N],q[N*],qf,qr;
int n,m,As[N],Ap[N],Bs[N],Bp[N],W,T,MaxP;
inline void read(int &v){
v=;
char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')v=v*+c-'',c=getchar();
}
int main(){
read(T); read(MaxP); read(W);
For(i,,T){
read(Ap[i]); read(Bp[i]);
read(As[i]); read(Bs[i]);
}
memset(f,,sizeof(f));
For(i,,T){
// I bought some stocks from nowhere
For(j,,As[i]){
f[i][j]=-*j*Ap[i];
}
// I didn't buy anything
For(j,,MaxP){
f[i][j]=max(f[i][j],f[i-][j]);
} if(i-W-<=)continue; // I bought some stock today after W days
qf=; qr=;
For(j,,MaxP){
while(qf<=qr&&q[qf]<j-As[i])qf++;
if(qf<=qr){
int k=q[qf];
f[i][j]=max(f[i][j],f[i-W-][k]+k*Ap[i]-j*Ap[i]);
}
while(qf<=qr&&f[i-W-][q[qr]]+q[qr]*Ap[i]<=f[i-W-][j]+j*Ap[i])qr--;
q[++qr]=j;
} // I sold some stock today after W days
qf=; qr=;
Dwn(j,MaxP,){
while(qf<=qr&&q[qf]>j+Bs[i])qf++;
if(qf<=qr){
int k=q[qf];
f[i][j]=max(f[i][j],f[i-W-][k]+k*Bp[i]-j*Bp[i]);
}
while(qf<=qr&&f[i-W-][q[qr]]+q[qr]*Bp[i]<=f[i-W-][j]+j*Bp[i])qr--;
q[++qr]=j;
}
}
int fn=-;
For(i,,MaxP)fn=max(fn,f[T][i]);
cout<<fn<<endl;
return ;
}

【BZOJ1855】[Scoi2010] 股票交易的更多相关文章

  1. [bzoj1855][Scoi2010]股票交易_动态规划_单调队列

    股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ...

  2. BZOJ1855 [Scoi2010]股票交易 【单调队列优化dp】

    题目链接 BZOJ1855 题解 设\(f[i][j]\)表示第\(i\)天结束时拥有\(j\)张股票时的最大收益 若\(i \le W\),显然在这之前不可能有交易 \[f[i][j] = max\ ...

  3. 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 ...

  4. bzoj1855: [Scoi2010]股票交易

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  5. 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)

    传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...

  6. 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 ...

  7. BZOJ1855 [Scoi2010]股票交易[单调队列dp]

    题 题面有点复杂,不概括了. 后面的状态有前面的最优解获得大致方向是dp.先是瞎想了个$f[i][j]$表示第$i$天手里有$j$张股票时最大收入(当天无所谓买不买). 然后写了一个$O(n^4)$状 ...

  8. 洛谷P2569 (BZOJ1855)[SCOI2010]股票交易 【单调队列优化DP】

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  9. 【BZOJ1855】[Scoi2010]股票交易 DP+单调队列

    [BZOJ1855][Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预 ...

  10. 【BZOJ1855】股票交易(动态规划,单调队列)

    [BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最 ...

随机推荐

  1. Delphi类的默认区域

    //类中数据成员的排列顺序一般是: 字段.方法.属性 //访问权限区域的顺序一般是:   无限制区(默认 published)   private   protected   public   pub ...

  2. vim学习之以退为进——可反复移动和可反复改动的美妙结合

    时间:2014.06.29 地点:基地 -------------------------------------------------------------------------------- ...

  3. 解决访问google的问题

    我用的是360安全浏览器. 1.点击扩展,搜索goole 2.可以看到第一个就是谷歌访问助手 3.下载安装 4.点击永久激活之后它会提示你怎么做 5.大概是让你修改主页,修改主页是在选项里,第一个基本 ...

  4. 青岛理工交流赛 H题 素数间隙

    13110581088注销 素数间隙 Time Limit: 1000MS Memory limit: 262144K 题目描述 Neko猫是一个很喜欢玩数字游戏的会说话的肥猫,经常会想到很多很好玩的 ...

  5. LightOJ1220 —— 质因数分解

    题目链接:https://vjudge.net/problem/LightOJ-1220 1220 - Mysterious Bacteria    PDF (English) Statistics ...

  6. 专网IP和公网IP的区别是什么

    专网ip是自己网内用,公网的话就全球有效 最大区别是公网IP世界只有一个,私网IP可以重复,但是在一个局域网内不能重复 访问互联网是需要IP地址的,IP地址又分为公网IP和私网IP,访问互联网需要公网 ...

  7. kubernetes要实现的目标——随机关掉一台机器,看你的服务能否正常;减少的应用实例能否自动迁移并恢复到其他节点;服务能否随着流量进行自动伸缩

    Kubernetes 是来自 Google 云平台的开源容器集群管理系统.基于 Docker 构建一个容器的调度服务.该系统可以自动在一个容器集群中选择一个工作容器供使用.其核心概念是 Contain ...

  8. Struts2 Action 匹配的几种方式

    下面针对我所遇见的Action的配置方法进行一下总结: 1.基本的匹配方法

  9. 上传图片 ajax input type="file" 兼容 ie chroem 火狐

    上传图片,转载请注明出处!!! 兼容 ie chroem 火狐 html: <div id="uploadForm"> <input id="file& ...

  10. vue 表单验证省市县三联动

    <el-col :span="24"> <el-form-item label="所在地区" prop="region" ...