吔队列了你——写点单调队列优化DP

news/2024/5/19 10:36:04/文章来源:https://www.cnblogs.com/TSTYFST/p/16714293.html

5_Lei:有没有变态一点的图啊

单调队列优化DP(补)

前言:

DP显然是OI中的一个重要且高频的考点,然而友善的出题人大多不会只考一个推转移方程,往往需要结合一些优化。

单调队列:

看这个的应该都会,不写了,扔个板子上去。

P1886 滑动窗口 /【模板】单调队列

优化DP:

显然,并不是所有的DP都可以用单调队列优化。一般来说,仅有形如

\[dp_{i} = \min/\max_{j = l_{i}}^{i - 1} \left \{ f_{j} \right \} + x \]

且满足 \(l_{i} ≤ l_{i + 1}\) 的DP才能优化。

翻译成人话:对于序列中的每一个点,从其左侧的一段决策区间内的最值进行转移,并且决策区间随着序列区间随着序列下标的增大不断右移。(其实就是一遍滑动窗口)

还是上边的式子,设 \(j <k\),若 \(d_{j}\) 劣于 \(f_{k}\) 的话,那么决策区间移动到 \(k\) 以后,\(j\) 以后永远不会成为最优决策点。

所以维护一个双端队列,满足下标递增,决策性递减。队首即为最优决策点。当队首超出了区间范围,直接出队。同时为了保证单调性,从队尾新加入点前,把队列中比它劣的点从队尾依次出队。

一些例题:

P2254 [NOI2005] 瑰丽华尔兹

给定一个 \(n \times m\) 的矩阵,以 \((x,y)\) 为起点,一共 \(k\) 段时间,每段时间为 \(\left [ s_{i},t_{i} \right ]\),每秒可以向 \(d_{i}\) 方向运动一个单位或不动,且不能超出矩阵,不能走到给出的矩阵的障碍物处,求运动的最长距离。

首先考虑暴力DP,设 \(dp[t][i][j]\) 代表在时刻 \(t\),运动到了 \((i,j)\) 的最长距离,不难得到转移方程为:

\[dp[t][i][j] = max(dp[t][i][j], dp[t - 1][i - dx_{d}][j - dy_{d}] + 1) \]

其中 \(d\) 代表方向,\(dx_{d}\) 代表移动时横坐标的变化量,\(dy_{d}\) 代表移动时纵坐标的变化量。然而它的时空复杂度都高达 \(O(n \times m \times t)\)

考虑优化,每个时间段只能向一个方向移动,所以按照时间段进行DP。设 \(dp[k][i][j]\) 代表在第 \(k\) 段时间,运动到 \((i,j)\) 的最长距离。

转移方程有:

\[dp[k][i][j] = \max{dp[k - 1][i'][j']} + dis(i,j,i',j') \]

\(i',j'\) 表示上一个合法的位置。并且 \((i,j)\)\((i',j')\) 一定在同一行或者同一列上。

考虑到方程中要求 \(\max\),且求可能拓展的状态有线性关系,所以考虑单调队列。

按照读入的每个时间段的方向,枚举每个方向的起始点。在单调队列里记录所在列或行某一个节点减去它到这一列或行初始位置的距离。对于每个点,用步数(就是初始点到当前点的距离)加上队首。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;const int MAXN = 210, MAXT = 40010;
const int dx[5] = {0, -1, 1, 0, 0};
const int dy[5] = {0, 0, 0, -1, 1};
int n, m, x, y, k, ans;
char hall[MAXN][MAXN];
int dp[MAXN][MAXN];struct Ship{int st, ed, opt;
}sh[MAXT];struct Line{int x, y, val;
}q[MAXT];int head = 1, tail = 0;inline int Get_dis(int ax, int ay, int bx, int by){return abs(ax - bx) + abs(ay - by);
}void Modify(int x, int y, int opt, int len){head = 1, tail = 0;while(x >= 1 && x <= n && y >= 1 && y <= m){if(hall[x][y] == 'x') //撞到家具了,之前搞的作废 head = 1, tail = 0;else{while(head <= tail && q[tail].val + Get_dis(x, y, q[tail].x, q[tail].y) < dp[x][y])tail--; //对答案肯定没有贡献,出去 q[++tail] = ((Line){x, y, dp[x][y]});while(head <= tail &&  max(abs(x - q[head].x), abs(y - q[head].y)) > len)head++;dp[x][y] = max(dp[x][y], q[head].val + Get_dis(x, y, q[head].x, q[head].y));ans = max(ans, dp[x][y]);}x += dx[opt];y += dy[opt];}
}inline int read(){int x = 0, f = 1;char c = getchar();while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return x * f;
}int main(){n = read(), m = read(), x = read(), y = read(), k = read();for(register int i = 1; i <= n; i++)scanf("%s", hall[i] + 1);memset(dp, -0x3f, sizeof(dp));dp[x][y] = 0;for(register int i = 1; i <= k; i++){sh[i].st = read(), sh[i].ed = read(), sh[i].opt = read();int len = sh[i].ed - sh[i].st + 1;if(sh[i].opt == 1)for(register int j = 1; j <= m; j++)Modify(n, j, sh[i].opt, len);else if(sh[i].opt == 2)for(register int j = 1; j <= m; j++)Modify(1, j, sh[i].opt, len);else if(sh[i].opt == 3)for(register int j = 1; j <= n; j++)Modify(j, m, sh[i].opt, len);else if(sh[i].opt == 4)for(register int j = 1; j <= n; j++)Modify(j, 1, sh[i].opt, len);}printf("%d", ans);return 0;
}

P2569 [SCOI2010]股票交易

P2627 [USACO11OPEN]Mowing the Lawn G

P3089 [USACO13NOV]Pogo-Cow S

CF372C Watching Fireworks is Fun

大家最喜欢的环节:

lei教主昨天提出了重要指导意见,所以今天贯彻落实一下。别问为什么是O,我没图了。

原1
原2
原3

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

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

相关文章

行业话题 | 天天坐地铁,你知道BIM在地铁中的应用吗

近年来&#xff0c;随着经济水平的不断提高和城市化进程的加快&#xff0c;我国地铁建设规模也在不断加大&#xff0c;而地铁车站是地铁施工的难点和控制性工程&#xff0c;具有施工空间狭小&#xff0c;技术复杂等特点。 由于施工现场布置制约因素多&#xff0c;二维施工现场平…

究竟都是谁在使用?OpenMLDB 落地案例大起底

本文整理自第四范式资深架构师、OpenMLDB PMC 卢冕在第四范式技术日「高效落地的AI开源生态」分论坛的主题分享——《开源机器学习数据库 OpenMLDB&#xff1a;提供线上线下一致的生产特征平台》。内容包括&#xff1a; 感恩 OpenMLDB 贡献者OpenMLDB 发展历程OpenMLDB 架构设…

WinForms时代结束,报表控件FastReport.NET开启FastReport.Core.Skia 时代!

要创建高质量的报告并将其正确导出为不同的格式&#xff08;PDF、Word、Excel 等&#xff09;&#xff0c;必须使用图形引擎。从 .NET Framework 的最早版本开始&#xff0c;Microsoft 就将 GDI 及其包装器用作 System.Drawing 库的一部分。FastReport.NET长期以来一直使用相同…

第一篇文章 mybatis 综述

mybatis框架可以让程序员只需专注于写sql语句 框架就是半成品&#xff0c;将公共的部分固定下来&#xff0c;非公共的部分你自己开发就行 三层架构&#xff1a; 界面层Conttroller层&#xff1a;用来接收客户端的输入&#xff0c;调用业务逻辑层Service层&#xff0c;返回结果…

关于Facebook营销的十个常见问题,一次性讲清楚!

--- NO.1--- 为什么做Facebook营销&#xff1f; 作为全球最大的社交媒体&#xff0c;Facebook月活用户已达到了惊人的29亿&#xff0c;并且这个数据还在持续增长中&#xff0c;这意味着全球几乎一半人都会出现在Facebook上。很多企业对Facebook的关注点&#xff0c;也从是否做…

VMware Explore 大会发布重磅云上技术之外,VMware 有哪些前沿探索?

编辑 | 宋慧 出品 | CSDN 云计算 最近&#xff0c;VMware 举办了年度技术大会 VMware Explore&#xff0c;重磅发布了其在多云趋势下的多个技术产品组合&#xff0c;包含了云基础架构、云原生、网络与安全、远程混合办公等等。不过&#xff0c;在这些优势领域的产品之外&#…

系统架构与设计(1)- 权限系统的设计以及主流的五种权限模型

作者:码猿技术专栏来源:https://juejin.cn/post/7121977695197970463 ------------------------------------------------------------------- 这篇文章就来介绍一下权限系统的设计以及主流的五种权限模型。权限管控可以通俗的理解为权力限制,即不同的人由于拥有不同权力,他…

阿里云国际站代理商:FFmpeg 处理音视频文件的常用方法

阿里云代理商&#xff08;聚搜云&#xff09;专业服务于阿里云ECS服务器采购、阿里云Ddos采购、阿里云waf采购、对象存储OSS、阿里云企业邮箱采购、阿里云国际站代理商、阿里云国际站充值、云安全中心&#xff08;态势感知&#xff09;、阿里云高可用云数据库RDS、web应用云waf…

YOLO系列目标检测算法-Scaled-YOLOv4

YOLO系列目标检测算法目录 YOLO系列目标检测算法总结对比YOLOv1YOLOv2YOLOv3YOLOv4 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 本文总结&#xff1a; 提出一种网络缩放方法&#xff0c;使得基于CSP的YOLOv4可以上下伸缩&#xff0c;以适…

2019Linux系统教程189讲-08_基于LAMP架构部署商城系统

任务需求 1、任务具体要求 使用yum(dnf)工具一键部署LAMP环境 发布电商项目上线 ① 能够实现web界面注册会员账号 ② 能够实现web界面进行后台商品及会员的管理 2、项目选型 ㈠ PHPSHE商城系统概述 PHPSHE商城系统是将商品管理、品牌管理、规格管理、折扣管理、拼团管理、…

【Electron】常用小功能实现合集

一、前言 本篇主要介绍在electron项目开发过程中&#xff0c;一些实用小功能点的实现。比如设置开机自启动、只允许打开一个应用、设置electron项目基地为中文、获取当前的系统数据等等。 二、功能点 接下来咱们就逐一来说一说这些功能点是如何实现的。 1.设置应用开机自启…

MySQL索引结构B+树

数据结构图示例网站&#xff1a;Data Structure Visualization 索引数据结构&#xff1a; 二叉树 红黑树 Hash表 B-Tree B-Tree&#xff0c;特点&#xff1a;&#xff08;每个节点都存储key和data&#xff0c;叶子节点指针为null&#xff09; 1、叶节点具有相同的深度&#x…

y140.第八章 Servless和Knative从入门到精通 -- Serving及实践(四)

5.Serving及实践 5.1 Knative Serving工作模式 Serving的工作模式,上图从一个更大的全景图上了解Serving以及它与istio进行结合的时候它们的工作逻辑,Serving有4个关键组件,最关键的组件就是kservice,kservice本身会有两个非常重要的组件组成,一个叫做configuration也就是…

linux驱动_uart

linux uart驱动基础知识下面链接这篇文章写得很完备&#xff0c;我没必要再介绍了&#xff0c;就写目前项目的代码&#xff0c;方便以后重温。 Linux的tty架构及UART驱动详解 本项目驱动文件包括&#xff1a; /kernel/drivers/sstar/serial/ms_uart.c # 主要实现文件 /kerne…

HTML 头部

html 中 <head> 元素包含了所有的头部标签元素。在 <head> 元素中可以插入脚本(scripts)、样式文件(CSS)及各种 meta 信息。 一般来说&#xff0c;可以添加在头部区域的元素标签有&#xff1a;<title>、<style>、<meta>、<link>、<scri…

借助实例,轻松掌握 Makefile

实例1&#xff1a;hello world 编辑 Makefile all:echo "hello world"编译执行 $ make $ make all 结果输出 语法说明 echo 前面必须只有 TAB&#xff08;即你键盘上的 TAB键&#xff09;&#xff0c;且至少有一个 TAB&#xff0c;不能用空格代替。 实例2&#xff…

python相关知识的巩固-《python与量化投资从基础到实战》的python基础部分

python与量化投资从基础到实战数据格式numpypandasSciPy 插值 积分 优化 图像处理 特殊函数OLS 回归分析插值正态性检验凸优化matplotlib 绘图的始祖&#xff0c;适合绘制简单的统计图表。Seaborn 绘制美观的图表Scikit-Learn 机器学习常用的第三方模块决策树支持向量机朴素贝叶…

Flink SQL解析嵌套Json数据测试过程调研

一、背景 测试需求->流式计算->json嵌套类型数据&#xff0c;流式计算的流程是基于&#xff0c;将配置的任务&#xff0c;转化为flink sql&#xff0c;然后提交到集群上&#xff0c;执行计算任务的过程&#xff0c;所以&#xff0c;除基本功能测试以外&#xff0c;需要考…

前端单元测试---孤勇者级教程

《孤勇者》最近火爆的一塌糊涂&#xff0c;占领了小学生、甚至幼儿园&#xff0c;连我家2岁多的儿子尽然也会哼几句。虽然他以为这首歌是奥特曼的主题曲。 回到正题&#xff0c;现代前端项目的工程化、模板化日益壮大&#xff0c;各种类库框架层出不穷&#xff0c;整个行业俨然…

JavaScript日期库之date-fn.js

前言 用官网的话来说&#xff0c;date-fn.js 就是一个现代 JavaScript 日期实用程序库&#xff0c;date-fns 为在浏览器和 Node.js 中操作 JavaScript 日期提供了最全面、但最简单和一致的工具集。那实际用起来像它说的那么神奇呢&#xff0c;下面就一起来看看吧。 安装 安装的…