
单调队列优化dp
hhhcbw
Hello World!!!
展开
-
单调队列优化dp(九)——#10183. 「一本通 5.5 练习 4」股票交易
题目链接:https://loj.ac/problem/10183解题思路dp[i][j]表示到第i天有j股股票的最大值,在第i天可以啥都不干,dp[i][j]=max(dp[i][j],dp[i-1][j]),也可以购买或者出售股票,前提前W天未操作股票,dp[i][j]=max(dp[i-W-1][j-k1]-k1*ap[i],dp[i-W-1][j+k2]+k2*bp[i])1<=k1<=as[i],1<=k2<=bs[i]。以t=i-W-1,x=j-k1,y=j+k2。原创 2020-09-26 22:41:40 · 272 阅读 · 0 评论 -
单调队列优化dp(八)——#10182. 「一本通 5.5 练习 3」理想的正方形
题目链接:https://loj.ac/problem/10182解题思路如果是一维的话,就是一个单调队列就能解决,现在变成二维了,其实是一样的,只不过,要减少的是一列,增加的是一列,每次找下一列的最小/最大值加入进去,其它按照一般单调队列维护即可。AC代码#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>using namespace std原创 2020-09-24 21:43:14 · 233 阅读 · 0 评论 -
单调队列优化dp(七)——#10181. 「一本通 5.5 练习 2」绿色通道
题目链接:https://loj.ac/problem/10181解题思路很明显想到二分答案,因为答案具有单调性,如果更小的空题段满足的话,那么比他长的空题段肯定满足。然后就是check函数,我们可以用单调队列优化dp来做,就和烽火传递这题一样了,这里也不过多赘述了,不懂的可以看一下我写的题解。AC代码#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm&g原创 2020-09-24 20:41:05 · 330 阅读 · 0 评论 -
单调队列优化dp(六)——#10180. 「一本通 5.5 练习 1」烽火传递
题目链接:https://loj.ac/problem/10180解题思路我们设dp[i][0]表示以 i 为结尾不选 i 满足条件的最小代价。dp[i][1]表示以 i 为结尾选 i 满足条件的最小代价。那么状态转移方程如下。dp[i][1]直接转移,dp[i][0]可由其前m-1个中最小的dp[j][1]转移,这就可以利用单调队列维护。最终复杂度是O(n)的。AC代码#include <iostream>#include <stdio.h>#include &l原创 2020-09-24 20:13:41 · 236 阅读 · 2 评论 -
单调队列优化dp(五)——#10179. 「一本通 5.5 例 5」Banknotes
题目链接:https://loj.ac/problem/10179解题思路来自于著名的lls的男人八题,其实是多重背包的裸体,直接二进制优化就能过,原创 2020-09-24 15:14:10 · 647 阅读 · 0 评论 -
单调队列优化dp(四)——#10178. 「一本通 5.5 例 4」旅行问题
题目链接:https://loj.ac/problem/10178解题思路先考虑顺时针,定义a[i]=p[i]-d[i],a[i]表示每次行驶改变了多少汽油,sum[i]为其前缀和,如果[1,n]中有sum[i]<0,则不能完成。否则,可以完成。然后一个长度为n的环可以拆分成一段长度为2n-1的链。然后,我们只要保证,每次长度为n的区间的sum最小值大于等于0,就能满足条件。这就可以使用单调队列去做。逆时针,与之类似。AC代码#include <iostream>#include原创 2020-09-23 21:37:37 · 380 阅读 · 0 评论 -
单调队列优化dp(三)——#10177. 「一本通 5.5 例 3」修剪草坪
题目链接:https://loj.ac/problem/10177解题思路我们设dp[i][0]表示以i为结尾不选i的最大值,dp[i][1]表示以i为结尾选i的最大值。我们可以得到以下状态转移方程。其中dp[i][1]可以继续转化。我们将sum[i]提取出来。我们发现后面是求一段连续区间内的最大值,所以可以用单调队列优化,复杂度O(n)。AC代码#include <iostream>#include <stdio.h>#include <cstri原创 2020-09-23 20:02:00 · 483 阅读 · 1 评论 -
单调队列优化dp(二)——#10176. 「一本通 5.5 例 2」最大连续和
题目链接:https://loj.ac/problem/10176解题思路设a[i]表示以i为结尾的不超过m的子序列的和的最大值是a[i]。如果这样按这个式子暴力去做的话,时间复杂度是O(n*m)的,肯定TLE。我们试着把式子转化一下。即我们每次只需要找前m个前缀和最小的那个减去。这样问题就转化成滑动窗口模型,可以用单调队列解决,时间复杂度O(n)。AC代码//给你一个长度为n的整数序列(A1,A2...An),要求从中找出一段连续的长度不超过m的子序列,使得这个序列和最大。#inc原创 2020-09-22 21:06:22 · 621 阅读 · 1 评论 -
单调队列优化dp(一)——#10175. 「一本通 5.5 例 1」滑动窗口
题目链接:https://loj.ac/problem/10175解题思路单调队列优化dp模板题,我们发现因为长度是固定的,每次只是少了前面一个,多了后面一个,这满足单调队列的性质,每次查询队首即可。AC代码#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;const int maxn=1e6+5;in原创 2020-09-22 19:57:51 · 265 阅读 · 0 评论