股票交易 (单调队列优化DP)】的更多相关文章

1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1083  Solved: 519[Submit][Status][Discuss] Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每个i,都有APi>=…
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w-1][k]+k*Ap[i]的单调性即可 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ; ]; int main(){ scanf("%d%d%d&qu…
上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚钱的最大值. 不难推出以下式子: $f[i][j]=max\left\{\begin{aligned}f[k][l]+(l-j)\times bp[i] , l \in [j,j+bs[i]]\\f[k][l]-(j-l)\times ap[i] , l \in [j-as[i],j]\\\end{…
这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天的状态无关!那么每一天更新那一天已经定了那么他对后面要转移的地方的影响就是手里的票了既然这样就加一维表示f[i][j]表示到第i天手里有j个票的最大收益这样就无后效性了f[i][j]=Max(f[i][j],f[last][x]-(j-x)*in[i]);f[i][j]=Max(f[i][j],f[…
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j]=max(dp[i-W-1][k]-(j-k)*AP[i],dp[i][j]) 3.前i-W-1天卖掉一些股: dp[i][j]=max(dp[i-W-1][k]+(k-j)*BP[i],dp[i][j]) 第一种转移是o(1)的 第二种如果枚举k时间复杂度接受不了八成是要T的 观察一下后发现 因…
传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直接从\(f_{i-w-1}\)那一层转移来,转移时枚举一下当前买卖多少.考虑优化,发现每次其实就是一个区间取\(max\),是由\(AS\)和\(BS\)所限制的区间,所以单调队列优化就好了,一个正着做一个倒着做,时间复杂度\(O(n^2)\) 代码 #include<bits/stdc++.h>…
传送门 题目分析: \(f[i][j]\)表示第i天,手中拥有j份股票的最优利润. 如果不买也不卖,那么\[f[i][j] = f[i-1][j]\] 如果买入,那么\[f[i][j] = max\{f[i - w - 1][k] - A_p*(j - k)\} (j - as + 1 \le k \le j)\]由于是从小的更新大的,所以顺序 如果卖出,那么\[f[i][j] = max\{f[i - w - 1][k] + B_p*(k - j)\} (j \le k \le j + bs…
描述 某位蒟佬要买股票, 他神奇地能够预测接下来 T 天的 每天的股票购买价格 ap, 股票出售价格 bp, 以及某日购买股票的上限 as,  某日出售股票上限 bs, 并且每次股票交 ♂ 易 ( 购买与出售都属于交易 )都需要间隔 W 天,手头股票总数不能超过 maxp 个. 请你想办法赚到最多的钱. T , maxp <= 2000 题解 定义 F[ i ][ j ] 为到第 i 天, 剩余 j 张股票 , 能够赚到最多的钱. 分如下几种情况: 股票仅从当天买: F[ i ][ j ] =…
题目描述 思路 蒟蒻还是太弱了,,就想到半个方程就GG了,至于什么单调队列就更想不到了. $f[i][j]$表示第$i天有j$张股票的最大收益. 那么有四种选择: 不买股票:$f[i][j]=max(f[i][j],f[i-1][j])$ 买$j$张股票,之前没有买:$f[i][j]=-j*ap[i]$ 买$j$张股票,之前有过交易,中间间隔了$w$天:$f[i][j]=max(f[i][j],f[i-w-1][k]-(j-k)*ap[i])$ 卖$j$张股票,之前有过交易(废话),中间间隔了$…
传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj<kj<k和j>kj>kj>k的情况我们分别对第二维建立单调队列转移. 代码: #include<bits/stdc++.h> #define N 2005 using namespace std; inline int read(){ int ans=0; char…