单调队列优化

眼界极窄的ZZ之前甚至不会单调队列……(好丢人啊)

单调队列优化的常见情景:

  • 转移可以转化成只需要确定一个维度,而且这个维度的取值范围在某个区间里

修剪草坪

这个题学长讲的好像是另外一个思路,但是码的时候不知不觉就偏到另一个思路里去了……改天也打打试试

需要注意的:

  • 这题中如果有多个满足最大值,我们应该取最靠前的,所以在弹队的时候用的是>
  • 这个题中单调队列维护的是\(dp_{j,0}-pre_j(i-k-1\leq j \leq i)\),这里的\(j\)是入队时的下标

    精华:
	for(int i=1;i<=n;i++)
{
dp[i][0]=max(dp[i-1][1],dp[i-1][0]);
while(fro<=bac&&Q[fro].id+k+1<=i)fro++;
//ll t=Q[fro].id;
dp[i][1]=Q[fro].v+pre[i];
while(fro<=bac&&dp[i][0]-pre[i]>Q[bac].v)bac--;
Q[++bac].v=dp[i][0]-pre[i];
Q[bac].id=i;
}

股票交易

这道题和上一道的特征很是不同……

  • 如果多个满足最大值,这个题里不需要选最靠前的,所以弹队的时候用的是
  • 这个题中单调队列维护的是(以买入举例,卖出同理)\(dp_{i-w-1,k}+k\cdot ap_i\),而这里的\(i\)是每循环都会更新的,所以就不能偷懒在入队时算好了
  • 手里没股票也是一种情况,所以算什么的时候都不要忘了考虑\(j=0\)的情况。

    (突然发现自己之前一直都在用一种诡异的结构体写法)

    精华:
for(int i=1;i<=t;i++)
{
for(int j=0;j<=as[i];j++)dp[i][j]=-j*ap[i];
for(int j=0;j<=mp;j++)dp[i][j]=max(dp[i][j],dp[i-1][j]);//nothing
if(i-w-1<0)continue;
fro=1;bac=0;
for(int j=0;j<=mp;j++)//buy
{
while(fro<=bac&&Q[fro]<j-as[i])fro++;
while(fro<=bac&&dp[i-w-1][j]+ap[i]*j>=dp[i-w-1][Q[bac]]+ap[i]*Q[bac])bac--;
Q[++bac]=j;
if(fro<=bac)dp[i][j]=max(dp[i][j],dp[i-w-1][Q[fro]]+ap[i]*Q[fro]-j*ap[i]);
}
fro=1;bac=0;
for(int j=mp;j>=0;j--)
{
while(fro<=bac&&Q[fro]>j+bs[i])fro++;
while(fro<=bac&&dp[i-w-1][j]+bp[i]*j>=dp[i-w-1][Q[bac]]+bp[i]*Q[bac])bac--;
Q[++bac]=j;
if(fro<=bac)dp[i][j]=max(dp[i][j],dp[i-w-1][Q[fro]]+bp[i]*Q[fro]-j*bp[i]);
}
}

瑰丽华尔兹

首先发现如果按每一个时刻设方程是\(O(n^3)\)的,会炸得很惨,

然后想到对每一个时间段列方程,因为时间段长度一定,所以发现出现了一个能够转移的区间,就可以考虑单调队列优化。

设从\((x',y')\)走到\((x,y)\),则有转移方程:\(dp[x][y]=dp[x'][y']+dis\)

然后把所有可以转移的用单调队列优化下即可,其他判边界啥的就是基本操作了

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
#define N 205
#define ll long long ll dp[N][N]={0};
ll dx[5]={0,-1,1,0,0};
ll dy[5]={0,0,0,-1,1}; struct QUE
{
ll v,id;
}Q[N];
ll f,b; ll n,m,x,y,k;
ll s,t,d;
ll mp[N][N];
ll ch; ll ans=0; void doit(ll sx,ll sy,ll dis,ll dir)
{
f=1;b=0;
for(int i=1;1<=sx&&sx<=n&&1<=sy&&sy<=m;sx+=dx[dir],sy+=dy[dir],i++)
{
//cout<<sx<<' '<<sy<<endl;
if(!mp[sx][sy]){f=1;b=0;continue;}
while(f<=b&&Q[f].id+dis<i)f++;
while(f<=b&&dp[sx][sy]>Q[b].v+i-Q[b].id)b--;
Q[++b]=(QUE){dp[sx][sy],i};
dp[sx][sy]=Q[f].v+i-Q[f].id;
//cout<<dp[sx][sy]<<endl;
}
} int main()
{
cin>>n>>m>>x>>y>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
do ch=getchar(); while(ch!='.'&&ch!='x');
ch=='.'?mp[i][j]=1:mp[i][j]=0;
}
}
memset(dp,128,sizeof(dp));
dp[x][y]=0;
for(int i=1;i<=k;i++)
{
cin>>s>>t>>d;
if(d==1)for(int j=1;j<=m;j++)doit(n,j,t-s+1,d);
else if(d==2)for(int j=1;j<=m;j++)doit(1,j,t-s+1,d);
else if(d==3)for(int j=1;j<=n;j++)doit(j,m,t-s+1,d);
else if(d==4)for(int j=1;j<=n;j++)doit(j,1,t-s+1,d);
}
ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
//cout<<dp[i][j]<<' ';
ans=max(ans,dp[i][j]);
}
//cout<<endl;
}
cout<<ans;
return 0;
}

诗人小G

这题首先要证明决策单调性,然而我根本不会四边形不等式,只能猜结论蒙过,所以先留坑,各位可以先看洛谷一位神仙的证明

主要思路就是单调队列存决策和他使用的范围,每次进队二分出新决策的范围,然后把劣质决策\(pop\)掉,然后每个决策拉一个指针指到上一个决策也就是当前队头

还有就是输出是真的恶心

我的天哪我都在讲些什么……总之这题需要一些理解时间,我水平有限只能写成这样了……大家还是多多思考吧QAQ

【刷题笔记】DP优化-单调队列优化的更多相关文章

  1. 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易

    DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...

  2. 洛谷P3975 跳房子 [DP,单调队列优化,二分答案]

    题目传送门 跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一 ...

  3. Codeforces 487B Strip (ST表+线段树维护DP 或 单调队列优化DP)

    题目链接 Strip 题意   把一个数列分成连续的$k$段,要求满足每一段内的元素最大值和最小值的差值不超过$s$, 同时每一段内的元素个数要大于等于$l$, 求$k$的最小值. 考虑$DP$ 设$ ...

  4. P2034 选择数字——线性dp(单调队列优化)

    选择数字 题目描述 给定一行 \(n\) 个非负整数 \(a[1]...a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输 ...

  5. HDU 4374 One hundred layer DP的单调队列优化

    One hundred layer Problem Description   Now there is a game called the new man down 100th floor. The ...

  6. Easy Climb UVA - 12170 滚动dp +离散化+ 单调队列优化

    E.Easy Climb Somewhere in the neighborhood we have a very nice mountain that gives a splendid view o ...

  7. 刷题向》POJ2823 单调队列裸题(<不会做,请自裁>系列)

    最近BZOJ炸了,而我的博客上又更新了一些基本知识,所以这里刷一些裸题,用以丰富知识性博客 POJ2823   滑动的窗口 这是一道经典的单调队题,我记得我刚学的时候就是用这道题作为单调队列的例题,算 ...

  8. ZOJ2067 经典 DP(单调队列优化)

    题目:一个由‘.’和‘#’组成矩形,统计里面'.'组成的矩形的个数. 点击打开链接 自己写挂了,懒得搞了 #include <stdio.h> #include <string.h& ...

  9. LeetCode刷题笔记-DP算法-取数问题

    题目描述 (除数博弈论)爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < ...

随机推荐

  1. SQL Server双机热备之发布、订阅实现实时同步

    一.复制的功能概述 SQL Server 复制功能实现了主从库的分离,从而将主库的压力分解掉,主库就主要负责数据的更改等,而主库主要负责查询ji.另外,有了主.从库,则从另一个方面,也了一层安全性,即 ...

  2. 自定义控件-只有横线的文本输入框(TxtLine)

    需求:在实际开发中,由于TextBox控件的背景色样式不美观,且TextBox不能直接设置背景颜色,因此需要使用自定义控件以实现如下效果 实现代码 public partial class TxtLi ...

  3. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之五(五十四)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  4. 一款基于.NET Core的认证授权解决方案-葫芦藤1.0开源啦

    背景 18年公司准备在技术上进行转型,而公司技术团队是互相独立的,新技术的推动阻力很大.我们需要找到一个切入点.公司的项目很多,而各个系统之间又不互通,导致每套系统都有一套登录体系,给员工和客户都带来 ...

  5. 一个名为不安全的类Unsafe

    最近为了更加深入了解NIO的实现原理,学习NIO的源码时,遇到了一个问题.即在WindowsSelectorImpl中的 pollWrapper属性,当我点进去查看它的PollArrayWrapper ...

  6. 易于理解的 python 深度学习摘要算法教程

    序 "我不想要一份完整的报告,只要给我一份结果摘要就好".我经常发现自己处于这种状况 -- 无论是在大学里还是在我的职业生涯中.我们准备一份全面的报告,但老师/主管却只有时间阅读摘 ...

  7. 获取元素计算样式getComputedStyle()与currentStyle

    window.getComputedStyle()方法是标准化接口,返回一个对象,该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有CSS属性的值. 私有的CSS属性值可以通过对 ...

  8. Check Host:实时监控网站或者服务器是否可以访问

    如果你拥有一个网站,那么最重要的事情就是要保证它24小时都能够访问.不过国内的虚拟主机服务非常糟糕,经常会出现各种状况,所以我们需要一个软件,可以让我们第一时间知道网站出现了无法访问的情况,从而通知售 ...

  9. MySQL 连接为什么挂死了?

    摘要:本次分享的是一次关于 MySQL 高可用问题的定位过程,其中曲折颇多但问题本身却比较有些代表性,遂将其记录以供参考. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感 ...

  10. CSS属性(display)

    1.display属性 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...