[SCOI2010]股票交易
题目大意:
网址:https://www.luogu.org/problemnew/show/P2569
大意:在接下来的T天中,每天股票有一个买入价格Api与卖出价格Bpi。
同时,每天买入股票数与卖出股票数分别不能超过Asi与Bsi。
再者,两次股票交易之间时间间隔必须小于W天,任一时刻持股数不能超过MaxP。
那么假设初始时钱数无限,求解T天后的最大收入值(>=0)。
\(0<=W<T<=2000,1<=MaxP<=2000\)
题目解法:
DP,状态太显然了:\(f[i][j]\) 表示到了第i天,持有j股的最大收入额。
转移也很容易:
[1] \(f[i][j] = -1*j*Ap[i] ;(j<=As[i])\) , 即从当天起直接购买。
[2] \(f[i][j] = f[i-1][j] ;\) , 即什么都不做。
[3] \(f[i][j] = f[i-W-1][t] - (j-t)*Ap[i];(0<=t<=As[i])\),即购买股票。
[4] \(f[i][j] = f[i-W-1][t] + (t-j)*Bp[i];(0<=t<=Bs[i])\), 即卖出股票。
直接这样转移的时间复杂度为\(O(N^3)\)的,显然过不去。
发现一个神奇的事情,[3]、[4]可以单调队列优化。
不知道单调队列优化的请戳这里
以优化[3]为例,优化[4]是类似的。
原来的转移方程:\(f[i][j] = f[i-W-1][t] - (j-t)*Ap[i];\)
拆开后移项:\(f[i][j] + Ap[i]*j = f[i-W-1][t] + Ap[i]*t\)
左右两边一模一样,满足单调队列优化要求,大力跑即可。
注意在处理[4]的时候要逆序处理,原因 滑稽自己yy一下啦
具体实现代码:
include<bits/stdc++.h>
#define maxn 2005
#define ll long long
#define gi(x) scanf("%lld",&x);
#define INF 1e16+7
using namespace std;
const ll zero = 0;
bool vis[maxn];
ll l1,l2,r1,r2,f[maxn][maxn],T,MaxP,W,Ap,Bp,As,Bs,Ans;
struct Node{ll j,f;};
struct cmp{
bool operator ()(Node a,Node b){
return a.f < b.f;}
};
priority_queue<Node,vector<Node>,cmp>Q;
int main(){
gi(T); gi(MaxP); gi(W);
for(ll i=0;i<=T;i++)for(ll j=0;j<=MaxP;j++)f[i][j]=-INF;
f[0][0] = 0;
for(ll i = 1; i <= T; i ++)
{
gi(Ap); gi(Bp); gi(As); gi(Bs);
ll bf = max(zero,i-W-1);
for(ll j = 0; j <= MaxP; j ++)
f[i][j] = f[i-1][j];
for(ll j = 0; j <= min(MaxP,As); j ++)
f[i][j] = max(f[i][j] , -1*Ap*j);
while(!Q.empty())Q.pop();
for(ll j = 0; j <= MaxP; j ++){
l1 = max(j-As,zero); r1 = j;
while(!Q.empty() && !(l1<=Q.top().j && Q.top().j<=r1))Q.pop();
Q.push((Node){j,f[bf][j] + Ap*j});
f[i][j] = max(f[i][j],Q.top().f - Ap*j);
}
while(!Q.empty())Q.pop();
for(ll j = MaxP; j >= 0; j --){
l2 = j; r2 = min(j+Bs,MaxP);
while(!Q.empty() && !(l2<=Q.top().j && Q.top().j<=r2))Q.pop();
Q.push((Node){j,f[bf][j] + Bp*j});
f[i][j] = max(f[i][j],Q.top().f - Bp*j);
}
}
Ans = 0;
for(ll i = 0; i <= MaxP; i ++)
Ans = max( Ans , f[T][i] );
cout<<Ans;
return 0;
}
[SCOI2010]股票交易的更多相关文章
- 1855: [Scoi2010]股票交易[单调队列优化DP]
1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ...
- 【BZOJ1855】[Scoi2010]股票交易 DP+单调队列
[BZOJ1855][Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预 ...
- 洛谷P2569 [SCOI2010]股票交易
P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...
- BZOJ 1855: [Scoi2010]股票交易(DP+单调队列)
1855: [Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未 ...
- [luogu] P2569 [SCOI2010]股票交易 (单调队列优化)
P2569 [SCOI2010]股票交易 题目描述 最近 \(\text{lxhgww}\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(\te ...
- 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569
题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ...
- [SCOI2010]股票交易(单调队列优化dp)
[SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第 ...
- [bzoj1855][Scoi2010]股票交易_动态规划_单调队列
股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ...
- P2569 [SCOI2010]股票交易 dp 单调队列优化
LINK:股票交易 题目确实不算难 但是坑点挺多 关于初值的处理问题我就wa了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...
随机推荐
- 6.C++初步分析类
面向对象的意义在于: -将日常生活中习惯的思维方式引入程序设计中 -将需求中的慨念直观的映射到解决方案中 -以模块为中心构建可复用的软件系统 -提高软件产品的可维护性和可扩展性 其中类和对象是面向对象 ...
- Jenkins持续集成-自动化部署脚本的实现
要实现Jenkins端的持续集成,其实在CI服务配置端很容易,难点呢?就是如何实现自动化的部署.我的脚本设计就是为了解决以下难题: 难点一.如何使得自动化部署脚本更通用 我用的脚本,依赖依赖一个配置文 ...
- IOS中DES与MD5加密方案
0 2 项目中用的的加密算法,因为要和安卓版的适配,中间遇到许多麻烦. MD5算法和DES算法是常见的两种加密算法. MD5:MD5是一种不可逆的加密算法,按我的理解,所谓不可逆,就是不能解密,那 ...
- mac攻略(2) -- apache站点配置
[http://www.cnblogs.com/redirect/p/6112164.html] Mac OS X 中默认有两个目录可以直接运行你的 Web 程序, 一个是系统级的 Web 根目录:/ ...
- H5 拖拽,一个函数搞定,直接指定对象设置可拖拽
页面上,弹个小窗体,想让它可以拖拽,又不想 加载一堆js,就简单的能让他可以拖动? 嗯,下面有这样一个函数,调用下就好了! 1. 先来说说 H5的 拖拽 在 HTML5 中,拖放是标准的一部分,任何元 ...
- Oracle创建表时Storage参数具体含义
本文通过图表和实例的阐述在Oracle数据库创建新表时Storage的参数具体含义. 可用于:表空间.回滚段.表.索引.分区.快照.快照日志 参数名称 缺省值 最小值 最大值 说明 INITIAL 5 ...
- 一个简单的定时表达式(HH:mm:ss)解析
前言 为客户开发了一个日志监控程序,监听各频道是否正常工作.其中有一个功能是这样的,当所有频道正常运行一段时间后,语音提示值班人员系统运行正常.一开始,想法比较简单,设置了一个变量,在线程不断轮询的过 ...
- Mysql的sql_mode
(一) 基本介绍 set sql_mode="",即强制不设定MySql模式(如不作输入检测.错误提示.语法模式检查等)应该能提高性能,但有如下问题: 如果插入了不合适数据(错误类 ...
- (转载,但不知道谁原创)获取SPRING 代理对象的真实实例,可以反射私有方法,便于测试
/** * 获取 目标对象 * @param proxy 代理对象 * @return * @throws Exception */ public static Object getTarget(Ob ...
- java堆内存详解
http://www.importnew.com/14630.htmljava堆的特点<深入理解java虚拟机>是什么描述java堆的 Java堆(Java Heap)是java虚拟机所管 ...