DP专练4:[SCOI 2010]股票交易(单调队列优化dp)

昨天晚上,初见它时,月黑风高,一个电脑,一支笔,一个人
在这里插入图片描述
今天秋高气爽,再一瞥,回眸间
在这里插入图片描述

我又来了,honey

  • 题目
  • 题解
  • 代码实现

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题解

首先这种 iii 天与前面 jjj 天有关联,而且让你求最后一天的极值
我们一定会联想到 DPDPDP


先搞定 dpdpdp 定义?

第一维毋庸置疑就是表示 iii 天,接着思考一下第二维 jjj
1)如果表示 iii 天买了或者卖了 jjj 股票,就遇到了一个问题,i−W−1i-W-1iW1 天的时候股票数又是多少呢?
难道我要再去用一重循环枚举吗?显然不现实。

2)如果表示 iii 天手上还拥有着 jjj 股票( iii 天已经操作完成了)
那么 ±k±k±k 就是 i−W−1i-W-1iW1 的股票数了

综上 dp[i][j]:idp[i][j]:idp[i][j]:i 天手上的股票数为 jjj 时的最大收益。

最后输出 dp[n][0]dp[n][0]dp[n][0] 就可以了,nnn 天的时候手上没有股票数肯定是最优解了,不然你手上捏着股票又买卖不了,拿来擦屁股吗??
在这里插入图片描述


找到转移方程式?

  • 这一天闲得慌,不买也不卖

    dp[i][j]=dp[i−1][j](0≤j≤MaxP)dp[i][j]=dp[i-1][j] (0≤j≤MaxP)dp[i][j]=dp[i1][j](0jMaxP)

  • 这一天才开始玩股票,只能去购进股票

    dp[i][j]=−j∗api(j−asi≤k<j)dp[i][j]=-j*ap_i(j-as_i≤k<j)dp[i][j]=japi(jasik<j)

  • 自由权比较大,手上有点资本,也要购进

    dp[i][j]=dp[i−W−1][k]−(j−k)∗api(j−asi≤k<j)dp[i][j]=dp[i-W-1][k]-(j-k)*ap_i(j-as_i≤k<j)dp[i][j]=dp[iW1][k](jk)api(jasik<j)

  • 该开始赚钱钱了,卖一点股票出去

    dp[i][j]=dp[i−W−1][k]+(k−j)∗bpi(j<k≤j+bsi)dp[i][j]=dp[i-W-1][k]+(k-j)*bp_i(j<k≤j+bs_i)dp[i][j]=dp[iW1][k]+(kj)bpi(j<kj+bsi)

在这四种情况下,取一个 maxmaxmax 即可。

那么为什么i-W-1就是当前最优解呢?

因为我们是一天一天递推过去的,当前最优解会被传递过去,

这也是我们DP需要完成的


分析这个 DPDPDP 的时间复杂度,O(n3)O(n^3)O(n3)

所以必须对 kkk 优化

我们就去拆一拆 case3 case4DPDPDP
在这里插入图片描述
dp[i][j]=dp[i−W−1][k]−(j−k)∗api(j−asi≤k<j)dp[i][j]=dp[i-W-1][k]-(j-k)*ap_i(j-as_i≤k<j)dp[i][j]=dp[iW1][k](jk)api(jasik<j)⇓\Downarrow dp[i][j]=dp[i−W−1][k]+k∗api−j∗api(j−asi≤k<j)dp[i][j]=dp[i-W-1][k]+k*ap_i-j*ap_i(j-as_i≤k<j)dp[i][j]=dp[iW1][k]+kapijapi(jasik<j)
我们会发现 j∗apij*ap_ijapi 是固定不变的。

也就是说真正影响 dp[i][j]dp[i][j]dp[i][j] 的是 dp[i−W−1][k]+k∗apidp[i-W-1][k]+k*ap_idp[iW1][k]+kapi

而且 dp[i−W−1][k]+k∗apidp[i-W-1][k]+k*ap_idp[iW1][k]+kapi 越大越好。

发现这个方程的实质是 k∈[j−asi,j)k∈[j-as_i,j)k[jasi,j) 这个范围内取得的且只和 kkk 有关。

dp[i][j]=dp[i−W−1][k]+(k−j)∗bpi(j<k≤j+bsi)dp[i][j]=dp[i-W-1][k]+(k-j)*bp_i(j<k≤j+bs_i)dp[i][j]=dp[iW1][k]+(kj)bpi(j<kj+bsi)⇓\Downarrowdp[i][j]=dp[i−W−1][k]+k∗bpi−j∗bpi(j<k≤j+bsi)dp[i][j]=dp[i-W-1][k]+k*bp_i-j*bp_i(j<k≤j+bs_i)dp[i][j]=dp[iW1][k]+kbpijbpi(j<kj+bsi)

我们会发现 j∗bpij*bp_ijbpi 是固定不变的。

也就是说真正影响 dp[i][j]dp[i][j]dp[i][j] 的是 dp[i−W−1][k]+k∗bpidp[i-W-1][k]+k*bp_idp[iW1][k]+kbpi

而且 dp[i−W−1][k]+k∗bpidp[i-W-1][k]+k*bp_idp[iW1][k]+kbpi 越大越好。

发现这个方程的实质是 k∈(j,j+bsi]k∈(j,j+bs_i]k(j,j+bsi] 这个范围内取得的且只和k有关

结合以上两种情况:就会联想到我们的单调队列了。

维护 kkk 的范围而且从大到小,每次取队头 headheadhead 进行更值

这样就转化成了O(n2)O(n^2)O(n2)


最后注意一下循环顺序

买股票就从小到大 0∼MaxP0\sim MaxP0MaxP

卖股票就从大到小 MaxP∼0MaxP\sim 0MaxP0

代码实现

#include <cstdio>
#include <iostream>
using namespace std;
#define MAXN 2005
int T, MaxP, W;
int ap, bp, as, bs;
int head, tail;
int deq[MAXN];
int dp[MAXN][MAXN];
int main() {scanf ( "%d %d %d", &T, &MaxP, &W );++ W;dp[0][0] = -MAXN * MAXN;for ( int i = 1;i <= MaxP;i ++ )dp[0][i] = dp[0][i - 1];for ( int i = 1;i <= T;i ++ ) {scanf ( "%d %d %d %d", &ap, &bp, &as, &bs );for ( int j = 0;j <= MaxP;j ++ )dp[i][j] = dp[i - 1][j];for ( int j = 0;j <= as;j ++ )dp[i][j] = max ( dp[i][j], -j * ap );if ( i > W ) {head = 1, tail = 0;for ( int j = 0;j <= MaxP;j ++ ) {while ( head <= tail && deq[head] < j - as )head ++;while ( head <= tail && deq[tail] * ap + dp[i - W][deq[tail]] <= j * ap + dp[i - W][j] )-- tail;deq[++ tail] = j;dp[i][j] = max ( dp[i][j], dp[i - W][deq[head]] + deq[head] * ap - j * ap );}head = 1, tail = 0;for ( int j = MaxP;j >= 0;j -- ) {while ( head <= tail && deq[head] > j + bs )head ++;while ( head <= tail && deq[tail] * bp + dp[i - W][deq[tail]] <= j * bp + dp[i - W][j] )tail --;deq[++ tail] = j;dp[i][j] = max ( dp[i][j], dp[i - W][deq[head]] + deq[head] * bp - j * bp );}}}printf ( "%d", dp[T][0] );return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【做题记录】[NOIP2016 普及组] 魔法阵

P2119 魔法阵 2016年普及组T4 题意&#xff1a; 给定一系列元素 \(\{X_i\}\) &#xff0c;求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 。 \[\begin{cases}X_a<X_b<X_c<X_d \\ X_a-X_b2\times (X_d-X_c) \\X_b-X_a<\dfrac{X_c-X_b}{3}\end{cases} \]…

“被狗啃”的按钮引发的开源社区信任危机

昨天&#xff0c;在国外民众还在欢度圣诞期间&#xff0c;开发者社区却对 Antd 开发团队发起了连番的炮轰。一觉醒来&#xff0c;他们发现由自己参与设计的、公司内网、办事系统等网页上&#xff0c;有一些按钮的上面多了一团白色的“积雪”&#xff0c;在白背景下&#xff0c;…

[COCI2017-2018#5] Pictionary(并查集+dfs)

贼ex的一道&#xff0c;卡了本仙女整整7个小时orz 思路容易理解&#xff0c;but码力very重要orz 我愿意花五毛钱提升我的码力&#xff0c;换个脑子也行&#xff0c;不换脸这张脸生得俊俏 luogu传送door 题目 在宇宙一个不为人知的地方&#xff0c;有一个星球&#xff0c;上面…

Docker最全教程——从理论到实战(九)

在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯的为讲解知识点而进行讲解。也就是说&#xff0c;笔者希望能够让大家将理论、知识、思想和指导应用到工作的实际场景和实践之中…

[2019CSP多校联赛普及组第五周] 调度CPU (贪心)

来来来&#xff0c;走过路过不要错过题目题解代码实现1代码实现2题目 ⼩Y同学有⼀块超级CPU&#xff0c;它有两个超级核⼼A和B。 A核⼼可以同时处理多项任务&#xff0c;每项任务处理时间为x&#xff0c;B核⼼只能同时处理⼀项任务&#xff0c;每项任务处理时间为y。 这⼀天…

NumSharp v0.6.1 科学计算库发布,支持标量和隐式转换

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

[Luogu2279][HNOI2003] 消防局的设立

文章目录题目法一&#xff1a;树上DP思路代码实现法二&#xff1a;贪心 搜索思路代码实现题目 2020年&#xff0c;人类在火星上建立了一个庞大的基地群&#xff0c;总共有n个基地。起初为了节约材料&#xff0c;人类只修建了n-1条道路来连接这些基地&#xff0c;并且每两个基…

dnSpy 强大的.Net反编译软件

一说起.net的反编译软件&#xff0c;大家首先想到的就是Reflector&#xff0c;ILSpy&#xff0c;dotPeek等等。而dnSpy同样是一款优秀的反编译软件&#xff0c;同时它是开源免费的。官方的描述是: dnSpy是一个调试器和.NET组件编辑器。 即使您没有任何可用的源代码&#xff0c;…

小奇探险

文章目录题目题解代码实现题目 小奇去遗迹探险&#xff0c;遗迹里有N个宝箱&#xff0c;有的装满了珠宝&#xff0c;有的装着废品。 小奇有地图&#xff0c;所以它知道每一个宝箱的价值&#xff0c;但是它不喜欢走回头路&#xff0c;所以要按顺序拿这N个宝箱中的若干个。 拿宝…

基于Asp.Net Core打造轻量级内部服务治理RPC(二 远程服务设计)

紧接上一篇《基于Asp.Net Core打造轻量级内部服务治理RPC(一)》文章。本文主要讲解基于Asp.Net Core的远程服务设计和实现。在上一篇中讲过,服务提供者提供的服务实际上就是一个Controller&#xff0c;那么是否在该程序中&#xff0c;服务都按照Asp.Net Core 中的Web Api的方式…

[NOIP 2009 提高组]最优贸易

勤劳的一更题目题解代码实现题目 C国有 n个大城市和 m 条道路&#xff0c;每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通行的道路在统计条数…

Azure Service Fabric Mesh:一个构建任务关键型微服务的平台

本文要点Azure Service Fabric Mesh&#xff08;目前处于预览阶段&#xff09;是一个完全托管的服务&#xff0c;它使你可以使用“无服务器”方法构建、部署和管理由运行在容器中的多语言服务组成的应用程序。Azure Service Fabric Mesh 通过使用 Envoy Proxy 构建的软件定义网…

P3265 [JLOI2015]装备购买

题目描述&#xff1a; 给N个整数向量&#xff0c;每个向量带权值&#xff0c;求权值和最小的线性基 题解&#xff1a; 按权值v从小->大排序&#xff0c;依次插入线性基。整数线性基的思想类似&#xff0c;只是此时“消去”不能直接xor完成&#xff0c;需要类似高斯消元一样…

Surging1.0发布在即,.NET开发者们,你们还在等什么?

开源&#xff0c;是近三十年来互联网经久不衰的话题。它不仅仅是一种技术分享的形态&#xff0c;更是一种开放&#xff0c;包容&#xff0c;互利共赢的互联网精神。 不到30年前&#xff0c;大神林纳德托瓦兹&#xff0c;在赫尔辛基大学实验室里&#xff0c;开发出了第一个版本的…

[SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)

辛勤二更题目题解错排数概念错排数递推公式及其证明代码实现这种题做的时候&#xff1a; 做完后&#xff1a;正常这就是生活&#xff0c;我们要学会习惯 题目 求有多少种长度为 n 的序列 A&#xff0c;满足以下条件&#xff1a; 1 ~ n 这 n 个数在序列中各出现了一次 若第 i …

失配树(border树)

4和6没有border关系 举例子&#xff1a; 当i 3时&#xff0c;j fa[i-1] fa[2] 0 s[j1] s[1] a s[3] 所以把i 3点的父亲设为j1 1 P5829 [模板]失配树

魔方俱乐部

爆肝感动三更题目思路90分代码&#xff08;MLE&#xff09;题解代码实现题目 fateice 来到了魔方俱乐部旅行。 魔方俱乐部有N个分部&#xff0c;每个分部均有且仅有一个虫洞&#xff0c;但是这虫洞只能通往一个分部。 每个分部有一个 orzFang 价值&#xff0c;第i个分部的 or…

模板:最大匹配

文章目录前言代码前言 匈牙利算法 可以解决的问题&#xff1a; &#xff08;原谅我的偷懒&#xff09; &#xff08;原谅我的水文&#xff09; 代码 #include<bits/stdc.h> using namespace std; #define ll long long const int N3e5100; const int mod1e97; int n,…

Stack Overflow 监控系统内部架构初探

Stack Exchange 架构主管 Nick Craver 在最近的一篇文章中介绍了他们的监控系统。他在文章中讨论了监控策略背后的理念和动机&#xff0c;并介绍了他们的工具集——主要是 Bosun、Grafana 和 Opserver。Stack Overflow 及其姐妹站点 Stack Exchange 运行在.NET 和 MS SQL Serve…

P5829 【模板】失配树

P5829 【模板】失配树 题目&#xff1a; 题解&#xff1a; 参考题解 我们先想一个问题&#xff1a;如何求出一个字符串的所有border&#xff1f; 如果一个字符串既是 S的前缀又是 S 的后缀&#xff0c;那么我们把 SS 自己平移一下就可以前后重合&#xff0c;然后我们就可以继…