[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了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...
随机推荐
- laravel框架学习-缓存,事件
缓存配置:app/config/cache.php 缓存: 增加缓存项: Cache::put( 'key', 'value', $Cachetime ); 在缓存中增加一个不存在 ...
- C++11 标准库也有坑(time-chrono)
恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time() 只能取到秒(win和linux) 想试试看能不能找到 至少可以取到毫秒的, 于是, 就找 ...
- Treap-平衡树学习笔记
平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...
- PPPoE拨号流程
PPPoE(Point to Point Protocol over Ethernet,基于以太网的点对点协议)的工作流程包含发现(Discovery)和会话(Session)两个阶段,发现阶段是无状 ...
- LaTeX 各种命令,符号
函数.符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} \acute{\eta} \check{\alpha} \grave{\eta} \breve{a} \ddot{y} ...
- 五分钟了解Hash算法
Hash算法详解 想象一下如果高级语言(Java,C++ ,C#)中如果没有实现类似List.Map等数据结构,企业级应用开发将是多么痛苦的事吧? Key-Value这种数据结构对于数据处理非常方便. ...
- Mysql主从复制_模式之日志点复制
MySQL数据复制的原理 MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).因此,要进行复制,必须在主服务器上启用二进制日志. 每个从服务器从主服务器接收主服务器已经记 ...
- Codeforces13E - Holes
Portal Description \(n(n\leq10^5)\)个洞排成一条直线,第\(i\)个洞有力量值\(a_i\),当一个球掉进洞\(i\)时就会被立刻弹到\(i+a_i\),直到超出\( ...
- MAVEN自动发布更新本地和远程仓库
1.本地仓库 的更新 mvn clean package install 2.远程 仓库 的更新 mvn clean package deploy 2.1工程文件pom.xml的设置 <bu ...
- HTML入门标签汇总
HTML入门标签汇总 1.<div></div>用于定义文档的区块,用来划分出独立不同的部分. 2.<h1></h1>数字1-6定义从大到小的标题. 3 ...