[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了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...
随机推荐
- PHPStorm 常用 设置配置 和快捷键大全 Win/Mac
[转自 http://blog.csdn.net/fenglailea/article/details/53350080] PHPStorm 下载及主题样式下载 http://www.lanmps.c ...
- python学习:匿名函数
Python 函数 lambda 匿名函数 -lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方. def fun(x,y): return x*y fu ...
- 使用单元素的枚举类型实现Singleton
从java1.5版本开始,实现singleton出现了第三种方式: public enum SingleTon { INSTANCE; public void speak() { System.out ...
- DB2日常维护——REORG TABLE命令优化数据库性能(转)
[转]DB2日常维护——REORG TABLE命令优化数据库性能 一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止一些错误 ...
- SQL替换语句 批量修改、增加、删除字段内容
sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符. 命令总解:update 表的名称 set 此表要替换的字段名=REPLACE(此表要替换的字段名, '原来内 ...
- 在centos 6.8下安装docker
1.检查自己的系统内核是不是64位系统,因为docker只能安装在64位系统中 命令: uname -a 结果 2.6.32-642.6.2.el6.x86_64 2.查看自己centos的版本 ca ...
- Egret学习笔记 (Egret打飞机-1.大致思路)
大致看了一遍Egret的官方文档,就开始打算使用Egret来开发一个打飞机游戏. 首先来捋一捋思路,先来看一看一个打飞机游戏的图片 基本上一个打飞机游戏分为 开始游戏 ----------进入游戏 ...
- Centos下的GitLab的安装汉化和数据备份以及管理员密码重置
前言: 安装版本:gitlab-ce-8.8.5-ce.1.el7.x86_64.rpm 下载地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yu ...
- MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁
浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视 ...
- hiho第151周 Building in Sandbox floodfill
题意:题目背景是<<我的世界>>,堆方块造房子,堆的规则是:新堆的方块必须和已有方块有重合面,而且不能往封闭空间里堆. 在三维空间中,给定一个堆的序列,判断符不符合规则. 数据 ...