→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. Hibernate的检索策略和优化

    一.检索策略概述 当我们实现了一对多或者多对多的映射后,在检索数据库时需要注意两个问题: 1.使用尽可能小的内存:当 Hibernate 从数据库中加载一个客户信息时, 如果同时加载所有关联这个客户的 ...

  2. 九度OJ 1094:String Matching(字符串匹配) (计数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1259 解决:686 题目描述: Finding all occurrences of a pattern in a text is a p ...

  3. python网络爬虫之使用scrapy爬取图片

    在前面的章节中都介绍了scrapy如何爬取网页数据,今天介绍下如何爬取图片. 下载图片需要用到ImagesPipeline这个类,首先介绍下工作流程: 1 首先需要在一个爬虫中,获取到图片的url并存 ...

  4. Codeforces Round #258 (Div. 2) D. Count Good Substrings —— 组合数学

    题目链接:http://codeforces.com/problemset/problem/451/D D. Count Good Substrings time limit per test 2 s ...

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

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

  6. js里=、== 和===有什么区别?

    说明:该文章是转载后进行修改完善的,望大家有收获. =是赋值运算符,==是关系运算符; ===是全等运算符. ”==”与”===”是不同的,一个是判断值是否相等,一个是判断值及类型是否完全相等.第一个 ...

  7. hdu 1391 Number Steps(规律)

    题意:找规律 思路:找规律 #include<iostream> #include<stdio.h> using namespace std; int main(){ int ...

  8. 封装class类为jar包提供给其他项目使用

    一.完成class类的编写与测试工作 二.完善javadoc注释,生成自己的API 注释要按照标准要求进行 Project -- generate  javadoc

  9. 多线程之:正确使用 Volatile 变量

    转载:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile ...

  10. webpack 错误心得

    使用webpack 打包项目已经有很长一段时间了,在使用过程中也碰到各种恶样的坑,常见的错误,当然也有少见的错误,今天写这篇文章主要是想分享找出错误和解决错误的方法. 而不是分享具体的错误例子,因为实 ...