BZOJ1855或洛谷2569 [SCOI2010]股票交易
一道单调队列优化\(DP\)
BZOJ原题链接
洛谷原题链接
朴素的\(DP\)方程并不难想。
定义\(f[i][j]\)表示到第\(i\)天,手上持有\(j\)股时的最大收益。
转移方程可以分成四个部分。
- 第\(i\)天为空手时买股票
\(\qquad\qquad f[i][j]=-AP_i\times j\)
- 第\(i\)天不进行交易
\(\qquad\qquad f[i][j]=\max\{f[i][j],f[i-1][j]\}\)
- 第\(i\)天在之前基础上买
\(\qquad\qquad f[i][j]=\max\limits_{k=\max\{j-AS_i,1\}}^{j-1}\{f[i][j],f[i-w-1][k]-AP_i\times (j-k)\}\)
- 第\(i\)天在之前基础上卖
\(\qquad\qquad f[i][j]=\max\limits_{k=j+1}^{\min\{j+BS_i,MaxP\}}\{f[i][j],f[i-w-1][k]+BP_i\times (k-j)\}\)
显然决策增减满足单调性,可以用单调队列维护,注意第\(4\)项要倒序才能维护。
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 2010;
int f[N][N], AP[N], BP[N], AS[N], BS[N], q[N];
int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c<'0' || c>'9'; c = getchar())
p = (c == '-' || p) ? 1 : 0;
for (; c >= '0'&&c <= '9'; c = getchar())
x = x * 10 + (c - '0');
return p ? -x : x;
}
inline int minn(int x, int y)
{
return x < y ? x : y;
}
inline int maxn(int x, int y)
{
return x > y ? x : y;
}
int main()
{
int i, j, n, m, w, l, r;
n = re();
m = re();
w = re();
memset(f, 250, sizeof(f));
for (i = 1; i <= n; i++)
{
AP[i] = re();
BP[i] = re();
AS[i] = re();
BS[i] = re();
f[i][0] = 0;
}
for (i = 1; i <= n; i++)
{
for (j = 0; j <= AS[i]; j++)
f[i][j] = -AP[i] * j;
for (j = m; j >= 0; j--)
f[i][j] = maxn(f[i][j], f[i - 1][j]);
if (i - w - 1 > 0)
{
for (r = j = 0, l = 1; j <= m; j++)
{
while (l <= r && q[l] < j - AS[i])
l++;
while (l <= r && f[i - w - 1][j] + AP[i] * j >= f[i - w - 1][q[r]] + AP[i] * q[r])
r--;
q[++r] = j;
if (l <= r)
f[i][j] = maxn(f[i][j], f[i - w - 1][q[l]] - AP[i] * (j - q[l]));
}
for (r = 0, l = 1, j = m; j >= 0; j--)
{
while (l <= r && q[l] > j + BS[i])
l++;
while (l <= r && f[i - w - 1][j] + BP[i] * j >= f[i - w - 1][q[r]] + BP[i] * q[r])
r--;
q[++r] = j;
if (l <= r)
f[i][j] = maxn(f[i][j], f[i - w - 1][q[l]] + BP[i] * (q[l] - j));
}
}
}
printf("%d", f[n][0]);
return 0;
}
BZOJ1855或洛谷2569 [SCOI2010]股票交易的更多相关文章
- 洛谷P2569 [SCOI2010]股票交易
P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...
- 洛谷 P2569[SCOI2010]股票交易(动规+单调队列)
//只能写出裸的动规,为什么会有人能想到用单调队列优化Orz 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测 ...
- 洛谷P2569 [SCOI2010]股票交易(单调队列)
传送门 惭愧……这种题目都没看出来…… 首先,我们用$dp[i][j]$表示在第$i$天,手上有$j$股时的最大收益 第一,我们可以直接买股票,即$dp[i][j]=-j*AP_i$,这个直接计算即可 ...
- 【解题报告】洛谷 P2571 [SCOI2010]传送带
[解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...
- BZOJ1856或洛谷1641 [SCOI2010]生成字符串
BZOJ原题链接 洛谷原题链接 可以将\(1\)和\(0\)的个数和看成是\(x\)轴坐标,个数差看成\(y\)轴坐标. 向右上角走,即\(x\)轴坐标\(+1\),\(y\)轴坐标\(+1\),表示 ...
- 洛谷 P1641 [SCOI2010]生成字符串
洛谷 这题一看就是卡塔兰数. 因为\(cnt[1] \leq cnt[0]\),很显然的卡塔兰嘛! 平时我们推导卡塔兰是用一个边长为n的正方形推的, 相当于从(0,0)点走到(n,n)点,向上走的步数 ...
- 洛谷 P1640 [SCOI2010]连续攻击问题
洛谷 一句话题意: 每个武器有两种属性,每种武器只能选择一种属性,从属性1连续递增才算攻击,求最大连续攻击次数. 因为同学告诉我这是二分图最大匹配,自然就往那个方向去想. 那么怎么建图呢? 每个武器只 ...
- 卡特兰数 洛谷P1641 [SCOI2010]生成字符串
卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...
- 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
随机推荐
- mab算法
https://zhuanlan.zhihu.com/p/21388070?refer=resyschina 专治选择困难症——bandit算法 改善:https://zhuanlan.zhihu.c ...
- 对于“2017面向对象程序设计(Java)第五周工作总结”存在问题的反馈及本周教学计划
一:问题反馈 “上周我们学习的新内容主要是第五章,并对第四章内容做了巩固.从学生上交的实验报告完成情况以及学习Java心得博客中的反馈可以看出,学生对构造器.重载.超类.多态.抽象类这几个概念理解的不 ...
- centos7里面docker不能下载本地源
报这种错的 编辑这个文件 加上这一段内容 rstart重启,搞定.
- Ubuntu系统查看mongo得慢日志,及一些操作
摘要 在MySQL中,慢查询日志是经常作为我们优化查询的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是开启Profiling功能.该工具在运行的实例上收集有关MongoDB的写操作 ...
- enum-枚举当做key-value业务使用
1.枚举当做key-value业务使用 package com.uwillbe.pad.enums; import java.util.ArrayList; import java.util.List ...
- Spring <tx:annotation-driven>注解 JDK动态代理和CGLIB动态代理 区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
- mysql5.7.10开启慢查询
MySql提供慢SQL日志的功能,能够记录下响应时间超过一定阈值的SQL查询,以便于我们定位糟糕的查询语句. 首先,查询当前mysql数据库是否开启了慢查询日志功能: show VARIABLES l ...
- response.sendfile() fails with Error: Forbidden
[response.sendfile() fails with Error: Forbidden] 参考:https://github.com/expressjs/express/issues/146 ...
- 二、Adapter 适配器
适配器:继承适配与委托适配 需求:Banner 可以输出强电流380v.弱电流12v,但是不能被直接使用.通过别的方式,介间的使用banner? 委托类图: 代码清单: 需要隐藏的功能类: publi ...
- Python基础之初始编码
前言 程序中的编码问题你不搞明白,那么你的程序生涯中它会像幽灵一样伴随着你的职业生涯. 首先要搞清楚一个概念:计算机中认识什么?它认识的是010101这种二进制,却不认识中文不认识英文 那么,这个时候 ...