BZOJ1855 股票交易 单调队列优化 DP
描述
某位蒟佬要买股票, 他神奇地能够预测接下来 T 天的 每天的股票购买价格 ap, 股票出售价格 bp, 以及某日购买股票的上限 as, 某日出售股票上限 bs, 并且每次股票交 ♂ 易 ( 购买与出售都属于交易 )都需要间隔 W 天,手头股票总数不能超过 maxp 个. 请你想办法赚到最多的钱.
T , maxp <= 2000
题解
定义 F[ i ][ j ] 为到第 i 天, 剩余 j 张股票 , 能够赚到最多的钱。
分如下几种情况:
- 股票仅从当天买: F[ i ][ j ] = - j * ap[ i ]
- 当天不买, 股票是之前买的 : F[ i ][ j ] = F[ i - 1][ j ]
- 在 w + 1 天之前的股票的基础上 购买若干股票得到: F[ i ][ j ] = F[ i - w - 1][ k ] - ( j - k ) * ap[ i ] 并且满足 j > k >= j - as
- 在 w + 1 天之前的股票的基础上 出售若干股票得到: F[ i ][ j ] = F[ i - w - 1][ k] + ( k - j ) * bp[ i ] 并且满足 j < k <= j + bs
就可以写出一个 O(T * maxp * maxp) 的dp, 当然是 O (不能过)
将 3 式子中的 F[ i - w - 1][ k ] + k * ap[i] 提取出来, 因为要满足最优解, 显然这个式子是越大越好, 又要满足 k >= j - as, 肯定是k 越大越好, 那么就可以用单调队列来进行优化
4 式子也同理可得, 不过3, 4 需要分开处理
代码
#include<cstring>
#include<cstdio>
#include<algorithm>
#define rd read()
#define rep(i,a,b) for( int i = (a); i <= (b); ++i )
#define per(i,a,b) for( int i = (a); i >= (b); --i )
using namespace std; const int N = 3e3; int t, ap[N], bp[N], as[N], bs[N], maxp, w, f[N][N], q[N]; int read() {
int X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar() ) if( c == '-' ) p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} int cal1( int x ,int y ) {
return f[x - w - ][y] + ap[x] * y;
} int cal2( int x, int y ) {
return f[x - w - ][y] + bp[x] * y;
} int main()
{
t = rd, maxp = rd, w = rd;
rep( i, , t ) ap[i] = rd, bp[i] = rd, as[i] =rd, bs[i] =rd;
memset(f, , sizeof(f));
f[][] = ;
rep( i, , t ) {
rep( j, , as[i] ) f[i][j] = -ap[i] * j;
rep( j, , maxp )f[i][j] = max( f[i][j], f[i - ][j] );
if( i <= w) continue;
int l = , r = ;
rep( j, , maxp ) {
while( l <= r && q[l] < j - as[i] ) l++;
if( l <= r ) f[i][j] = max( f[i][j], f[i - w - ][ q[l] ] - ap[i] * ( j - q[l] ) );
while( l <= r && cal1( i, q[r] ) <= cal1( i, j ) ) r--;
q[++r] = j;
}
l = , r = ;
per( j, maxp, ) {
while( l <= r && q[l] > j + bs[i] ) l++;
if( l <= r ) f[i][j] = max( f[i][j], f[i - w - ][q[l]] + bp[i] * ( q[l] - j ) );
while( l <= r && cal2( i, q[r] ) <= cal2( i, j ) ) r--;
q[++r] = j;
}
}
int ans = ;
rep( i, , t ) ans = max( ans, f[i][]);
printf("%d\n",ans);
}
BZOJ1855 股票交易 单调队列优化 DP的更多相关文章
- 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP
上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
- 1855: [Scoi2010]股票交易[单调队列优化DP]
1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ...
- SCOI 股票交易 单调队列优化dp
这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...
- LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)
传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直 ...
- BZOJ 1855 股票交易 - 单调队列优化dp
传送门 题目分析: \(f[i][j]\)表示第i天,手中拥有j份股票的最优利润. 如果不买也不卖,那么\[f[i][j] = f[i-1][j]\] 如果买入,那么\[f[i][j] = max\{ ...
- 股票交易——单调队列优化DP
题目描述 思路 蒟蒻还是太弱了,,就想到半个方程就GG了,至于什么单调队列就更想不到了. $f[i][j]$表示第$i天有j$张股票的最大收益. 那么有四种选择: 不买股票:$f[i][j]=max( ...
- 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)
传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...
随机推荐
- ssl 的jks 生成工具
https://www.myssl.cn/tools/merge-jks-cert.html 通过key 私钥 ,和公钥pem 生成jks
- 小程序-setData
根据下标修改数组中的key: var id = e.target.id//根据点击不同的view获取对应的id值 var str = "isChecked[" + id + &qu ...
- MVC005之页面调用控制器中的方法
描述:控制器在传给页面数据时,有时我们需要对传过来的数据进行二次处理 如: 1:传过来部门编码,但页面上要显示为部门名称 2:格式转换等 我们在写aspx时一般在cs文件中写一个protected的方 ...
- Python 多继承与MRO-C3算法
继承关系图:树结构 广度优先遍历:先找A,再找B.C,最后找D.E.(顺序:A.B.C) 深度优先遍历:先找A,再找B,接着找D.E(把B里面找完):然后找C.(顺序:A.B.D.E.C) MRO-C ...
- JMeter学习(十二)分布式部署(转载)
转载自 http://www.cnblogs.com/yangxia-test Jmeter 是java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有 ...
- tab template
<div class="box"> <div class="box-body"> <div class="nav-tab ...
- 完整性约束&外键变种三种关系&数据的增删改
完整性约束 本节重点: not null 与 default unique primary auto_increment foreign key 一.介绍 约束条件与数据类型的宽度一样,都是可选参数 ...
- 生成二维码的JAVA
不多说,上代码 package tcc; import java.awt.Color;import java.awt.Graphics2D;import java.awt.image.Buffered ...
- HDU-1002.大数相加(字符串模拟)
本题大意:给出两个1000位以内的大数a 和b,让你计算a + b的值. 本题思路:字符串模拟就能过,会Java的大佬应该不会点进来...... 参考代码: #include <cstdio&g ...
- springmvc整合mybatis 配置文件
使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...