bzoj 1855: [Scoi2010]股票交易
Description
Input
Output
Sample Input
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1
Sample Output
HINT
对于30%的数据,0 < =W 对于50%的数据,0 < =W 对于100%的数据,0 < =W
对于所有的数据,1 < =BPi < =APi < =1000,1 < =ASi,BSi < =MaxP
Source
这个按lst大佬的话来讲好像叫未来收益型Dp?
跟杭二联考的时候做过一个叫分组的题,暴力的做法跟这个题比较像,不再赘述。
首先设f[i][j]表示到了第i天,有j支股票,收益的最大值(这个收益是算了买股票的代价的)
暴力的转移:
复杂度为O(n*MaxP*MaxP),而且这个东西看起来貌似不太好优化。。
把第二和第三个方程转化一下:
然后再整理一下:
发现转移的前面一项是之和k有关的,我们要求的就是前面一项的最大值。
这个我们可以通过把前一项压进单调队列中,维护单调递减的单调队列即可,复杂度为O(n*MaxP)。。
// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int N=100050;
int f[3000][3000],ap[N],bp[N],as[N],bs[N],W,T,MaxP,q[N];
int main(){
scanf("%d%d%d",&T,&MaxP,&W);
for(int i=1;i<=T;i++) scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);
memset(f,-127/3,sizeof(f));int Inf=f[0][0];f[0][0]=0;
for(int i=1;i<=T;i++){
for(int j=0;j<=MaxP;j++) f[i][j]=max(f[i][j],f[i-1][j]);
/*for(int k=max(j-as[i],0);k<=j;k++){
if(f[max(0,i-W-1)][k]==Inf) continue;
f[i][j]=max(f[i][j],f[max(0,i-W-1)][k]-ap[i]*(j-k));
}
for(int k=j;k<=min(j+bs[i],MaxP);k++){
if(f[max(0,i-W-1)][k]==Inf) continue;
f[i][j]=max(f[i][j],f[max(0,i-W-1)][k]+bp[i]*(k-j));
}*/
int head=1,tail=0;q[++tail]=0;
for(int j=0;j<=MaxP;j++){
while(head<=tail&&q[head]<max(j-as[i],0)) head++;
f[i][j]=max(f[i][j],f[max(0,i-W-1)][q[head]]-ap[i]*(j-q[head]));
while(head<=tail&&f[max(0,i-W-1)][j]+ap[i]*j>f[max(0,i-W-1)][q[tail]]+ap[i]*q[tail]) tail--;
q[++tail]=j;
}
head=1,tail=0;q[++tail]=MaxP;
for(int j=MaxP;j>=0;j--){
while(head<=tail&&q[head]>min(MaxP,j+bs[i])) head++;
f[i][j]=max(f[i][j],f[max(0,i-W-1)][q[head]]+bp[i]*(q[head]-j));
while(head<=tail&&f[max(0,i-W-1)][j]+bp[i]*j>f[max(0,i-W-1)][q[tail]]+bp[i]*q[tail]) tail--;
q[++tail]=j;
}
}
int ans=Inf;
for(int j=0;j<=MaxP;j++) ans=max(ans,f[T][j]);
printf("%d\n",ans);
return 0;
}
bzoj 1855: [Scoi2010]股票交易的更多相关文章
- ●BZOJ 1855 [Scoi2010]股票交易
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1855 题解: DP,单调队列优化.(好久没做 DP题,居然还意外地想出来了) 定义 dp[i ...
- BZOJ 1855 [Scoi2010]股票交易 ——动态规划
DP方程是比较简单的,主要有三种:什么都不做.买入.卖出. 发现买入卖出都是$\Theta (n^3)$但是转移方程都是线性的,而且决策和当前的情况是分开的. 所以可以单调队列优化. 复杂度$\The ...
- 1855: [Scoi2010]股票交易[单调队列优化DP]
1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ...
- BZOJ 1855: [Scoi2010]股票交易(DP+单调队列)
1855: [Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未 ...
- 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569
题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ...
- [BZOJ 1855] 股票交易
Link: BZOJ 1855 传送门 Solution: 比较明显的$dp$模型 令$dp[i][j]$为第$i$天持有$j$支股票时的最大利润 对其购买股票和售出股票分别$dp$,这里以购买为例: ...
- 【BZOJ1855】[Scoi2010]股票交易 DP+单调队列
[BZOJ1855][Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预 ...
- 洛谷P2569 [SCOI2010]股票交易
P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...
- [luogu] P2569 [SCOI2010]股票交易 (单调队列优化)
P2569 [SCOI2010]股票交易 题目描述 最近 \(\text{lxhgww}\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(\te ...
随机推荐
- PHP+Redis 实例【二】页面缓存 新玩法
今天算是认识到博客园里的审查团队多内幕了,哈哈,贴个图玩下. 气死宝宝了. 进入主题! 今天就不写什么功能性的了,换下口味说下关于页面级的缓存,应该怎么做. 相信有很多小伙伴查了百度,甚至google ...
- Mysql--单表数据记录查询
1.简单数据记录查询 1.1 简单数据查询 1.1.1 查询所有字段数据 例子: 1.1.2 "*"符号的使用 语法: 例子: 1.1.3 查询指定字段数据 例子: ...
- linux 挂在win下文件
使用mount命令 #mount -t cifs -o username=abc,password=1234 //192.168.1.10/linux /mnt/linux #mount -t cif ...
- ctrl+z 以后怎么恢复挂起的进程
(1) CTRL+Z挂起进程并放入后台 (2) jobs 显示当前暂停的进程 (3) bg %N 使第N个任务在后台运行(%前有空格) (4) fg %N 使第N个任务在前台运行 默认bg,fg不带% ...
- vue2.x利用脚手架快速构建项目并引入bootstrap、jquery
要使用vue-cli脚手架搭建项目,首先需要安装node.js Node.js官网:https://nodejs.org/en/download/ 选择你对应的系统即可下载,下载完成后傻瓜式安装即可. ...
- 【前端开发】--js弹框
js三种弹框 一.普通弹框 这类弹框就是仅仅是个提示作用,并不会做其它操作 关键词:alert() 这个没啥好说的,就是一个弹框. 二.判断弹框 这类框有一个判断作用 关键字:conf ...
- 洛谷最短路计数SPFA
题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...
- 完整教程--idea使用git进行项目管理
第一部分: 安装 1. 下载地址: https://git-scm.com/download/win; 如果速度慢, 使用 迅雷下载; 2. 点击安装, 然后下一步, 直到下面这个页面: 建议: 按 ...
- C# RichTextBox设置行间距
之前从CSDN上下载了一个代码,参看之后,改了一些内容,感觉设置行间距更具体,不会因为字号的变化而受到影响,具体代码参看: CSDN:http://download.csdn.net/detail/n ...
- Python爬虫(十)_正则表达式
本篇将介绍python正则表达式,更多内容请参考:[python正则表达式] 什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操 ...