[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了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...
随机推荐
- xBIM WeXplorer xViewer 浏览器检查
目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...
- Xshell配置SSH秘钥登录
秘钥生成 生成公钥 工具 -> 新建用户秘钥生成向导 -> 下一步 -> 点击下一步,输入密码: 点击下一步 点击保存为文件,完成. 生成私钥 工具 -> 用户秘钥管理者 选中 ...
- Taurus.MVC 2.2.3.4 :WebAPI 实现权限控制认证(及功能增强说明)
前言: 前两天,当我还在老家收拾行旅,准备回广州,为IT连的创业再战365天时, 有网友扣上问:Taurus.MVC中如何实现认证和权限控制,最好能做个小例子. 我一不小心回了句:等回广州我再写篇文章 ...
- springboot入门_helloworld
开始学习springboot,在此做记录,有不正确之处,还望读者指正. springboot框架的设计目的是用来简化新Spring应用的初始环境搭建以及开发过程.主要体现有:1 xml配置文件,使用s ...
- scp的简单记忆方法
scp虽然只有把文见发送到远端和从远端copy文件俩功能,但是常常把俩功能的先写什么给计混了,所以我就用通俗的大白话给总结了下,十分容易记忆,这里给大家分享一下.scp 我们常用的两个功能: (1)把 ...
- java2 - 语言基础
一.结构流程图制作工具 xmind 的使用 二.Java 基础数据类型 回答以下问题: java 基本数据类型有几种? 整数类型是哪几种? 浮点数类型是哪几种? 字符类型关键字? 布尔类型关键字? 为 ...
- PHP不使用任何内置函数实现字符串翻转
实现字符串翻转PHP本身自带一个函数就可以解决,strrev函数.这里不适用任何内置函数实现字符串翻转 案例一(纯字母): $str = 'abcdefghig k'; //假设测试的字符串/g与k之 ...
- acm水题3个:1.求最大公约数;2.水仙花数;3.判断完数
//7.求两个整数的最大公约数#include<stdio.h>//用穷举法求出最大公约数int gcd1(int m,int n){ int min = m > n ? n : m ...
- Java多维数组各轴长度可以不对齐
- CodeForces - 551C 二分+贪心
题意:有n个箱子形成的堆,现在有m个学生,每个学生每一秒可以有两种操作: 1: 向右移动一格 2: 移除当前位置的一个箱子 求移除所有箱子需要的最短时间.注意:所有学生可以同时行动. 思路:二分时间, ...