一道单调队列优化\(DP\)

BZOJ原题链接

洛谷原题链接

朴素的\(DP\)方程并不难想。

定义\(f[i][j]\)表示到第\(i\)天,手上持有\(j\)股时的最大收益。

转移方程可以分成四个部分。

  1. 第\(i\)天为空手时买股票

\(\qquad\qquad f[i][j]=-AP_i\times j\)

  1. 第\(i\)天不进行交易

\(\qquad\qquad f[i][j]=\max\{f[i][j],f[i-1][j]\}\)

  1. 第\(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)\}\)

  1. 第\(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]股票交易的更多相关文章

  1. 洛谷P2569 [SCOI2010]股票交易

    P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...

  2. 洛谷 P2569[SCOI2010]股票交易(动规+单调队列)

    //只能写出裸的动规,为什么会有人能想到用单调队列优化Orz 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测 ...

  3. 洛谷P2569 [SCOI2010]股票交易(单调队列)

    传送门 惭愧……这种题目都没看出来…… 首先,我们用$dp[i][j]$表示在第$i$天,手上有$j$股时的最大收益 第一,我们可以直接买股票,即$dp[i][j]=-j*AP_i$,这个直接计算即可 ...

  4. 【解题报告】洛谷 P2571 [SCOI2010]传送带

    [解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...

  5. BZOJ1856或洛谷1641 [SCOI2010]生成字符串

    BZOJ原题链接 洛谷原题链接 可以将\(1\)和\(0\)的个数和看成是\(x\)轴坐标,个数差看成\(y\)轴坐标. 向右上角走,即\(x\)轴坐标\(+1\),\(y\)轴坐标\(+1\),表示 ...

  6. 洛谷 P1641 [SCOI2010]生成字符串

    洛谷 这题一看就是卡塔兰数. 因为\(cnt[1] \leq cnt[0]\),很显然的卡塔兰嘛! 平时我们推导卡塔兰是用一个边长为n的正方形推的, 相当于从(0,0)点走到(n,n)点,向上走的步数 ...

  7. 洛谷 P1640 [SCOI2010]连续攻击问题

    洛谷 一句话题意: 每个武器有两种属性,每种武器只能选择一种属性,从属性1连续递增才算攻击,求最大连续攻击次数. 因为同学告诉我这是二分图最大匹配,自然就往那个方向去想. 那么怎么建图呢? 每个武器只 ...

  8. 卡特兰数 洛谷P1641 [SCOI2010]生成字符串

    卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...

  9. 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告

    P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...

随机推荐

  1. Oracle查看SQL执行计划的方式

    Oracle查看SQL执行计划的方式     获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式:   基本有以下几种方式: ...

  2. java-学习2

    第一节 Java语言介绍 1.Java的起源 Oak-->Java      交互式操作智能家居 2.Java的发展 Java1.0 Java1.2    JavaSE  :Java平台标准版  ...

  3. html -引入其他html页面

    其他页面html为:ip.html 主页面代码 <body> <div id="ip"></div> </body> <scr ...

  4. Unity&Sqlite数据库

    Sqlite是一个跨平台关系型小型数据库,非常便利,适合于嵌入式设备:对于Sqlite数据库来说,这个数据库是以文件的形成存在的(比如data.db):数据库是由表组成的,在一个数据库里面可以存储多个 ...

  5. 测试工具之appcrawler的使用

    appcrawler 标签(空格分隔): appcrawler appcrawler 简介 一个基于自动遍历的app爬虫工具. 支持android和iOS, 支持真机和模拟器. 最大的特点是灵活性. ...

  6. cdnbest如何查看站点操作日志(同步日志)

     1. 在区域列表点同步日志 2. 点击进入后,可以查看对哪个站点进行了操作,操作时间,ip,id都有记录 3. 想知道详细操作了什么内容把鼠标指向操作类型,就会弹出操作的信息

  7. 2021工厂取消2094仓位需求,不参与FP分析

    正确做法应该是修改这个sSIS NOT IN 2094 目前在不修改SSIS前提下,可以先在进IN表前过滤掉

  8. Mysql 用户 创建与删除(基础1)

    Mysql是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个 ...

  9. 调css时候,设置margin-left没有效果

    调css时候,如果设置margin-left没有效果,可能是span不是块元素.设置display:block;即可.

  10. java中继承thread类的其他类的start()方法与run()方法

    java中继承thread或者实现runnable接口的类必须重写run()方法. 如果其执行了start()方法,其实就是启动了线程的run()方法. 注意:如果是实现runnable接口的类是没有 ...