最大矩阵面积问题


问题概述

最大矩阵面积问题有两种:

  1. 在一个网格图中,一些格子有障碍,求在网格图中规划一个矩形,使得它不会覆盖任何一个障碍格且面积最大。
  2. 在一个平面直角坐标系中,先给你规定一个大矩形(一般左下角是 ( 0 , 0 ) (0, 0) (0,0),右上角是 ( M a x X , M a x Y ) (MaxX, MaxY) (MaxX,MaxY)),有一些障碍点,求在这个大矩形中规划一个小矩形,使得它不会覆盖每一个障碍点(障碍点可在矩形边缘)。

具体问题

对于第一个类型:洛谷 P4147 玉蟾宫
对于第二个类型:洛谷 P1578 奶牛浴场


解法

1.悬线法

一般用在方格图中,时间复杂度为整个方格图大小 O ( n m ) O(nm) O(nm)
h i , j h_{i,j} hi,j 表示从 ( i , j ) (i, j) (i,j) 出发,向上拓展,成一个左右宽度一格的细长矩形的高度
如下图:
(学校机房图片上传不上去,先鸽着)

再设 l i , j , r i , j l_{i, j},\space r_{i, j} li,j, ri,j 为以这个细长矩形为中轴线,向左、向右拓展,遇到第一个障碍格的列坐标(没有的话就分别设为 0 0 0 m + 1 m + 1 m+1)。
如下图:
(同上)

枚举每个格子,求出每个 h i , j , l i , j , r i , j h_{i,j},l_{i,j},r_{i,j} hi,j,li,j,ri,j 的值,最后用 h i , j × ( r i , j − 1 − l i , j ) h_{i,j} \times (r_{i, j} - 1 - l_{i,j}) hi,j×(ri,j1li,j) 来更新最大面积 a n s ans ans

下面给出玉蟾宫代码:

#include <bits/stdc++.h>
using namespace std;const int maxn = 1e3 + 7;int n, m, ans = 1;
char g[maxn][maxn];
// l[i][j]:(i, j)向左能到达最远的地方
// r[i][j]:(i, j)向右能到达最远的地方
// h[i][j]:(i, j)向上能到达最远的地方
// ans = max(ans, (r[i][j] - l[i][j] + 1) * h[i][j])// 看看是不是全是 R
bool check() {for (int  i = 1; i <= n; i++)for (int j = 1; j <= m; j++)if (g[i][j] != 'R')return false;return true;
}
int l[maxn][maxn], r[maxn][maxn], h[maxn][maxn];
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> g[i][j];h[i][j] = 1, l[i][j] = r[i][j] = j;}for (int j = 2; j <= m; j++) if (g[i][j - 1] == 'F' && g[i][j] == 'F')l[i][j] = l[i][j - 1];for (int j = m - 1; j >= 1; j--) if (g[i][j + 1] == 'F' && g[i][j] == 'F')r[i][j] = r[i][j + 1];}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (g[i][j] == 'F' && g[i - 1][j] == 'F' && i > 1) {h[i][j] = h[i - 1][j] + 1;if (l[i - 1][j] > l[i][j])l[i][j] = l[i - 1][j];if (r[i - 1][j] < r[i][j])r[i][j] = r[i - 1][j];/*R F RF F F(2, 2)为当前所在位置,l[2][2]原本等于1, r[2][2]原本等于3,但由于g[1][2] == 'F', 符合 h 更新要求,所以l[2][2]更新为2, r[2][2]更新为2.*/}ans = max(ans, (r[i][j] - l[i][j] + 1) * h[i][j]);/* 当l[2][2] == 2, r[2][2] == 2, h[2][2] == 2时,答案显然不是最优,当循环扫到(2, 1)时,l[2][1] == 1, r[2][1] == 3, h[2][1] == 1,答案最优.*/}}// 特判是否全为 Rif (check())printf("0\n");else printf("%d\n", ans * 3);return 0;
}

当然还可以用单调站求 h i , j , l i , j , r i , j h_{i,j},l_{i,j},r_{i,j} hi,j,li,j,ri,j

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e3 + 7;
const int inf  = 0x3f3f3f3f;int n, m;
bool a[maxn][maxn];
int h[maxn][maxn];
int l[maxn][maxn], r[maxn][maxn];
int sta[maxn], top;
int ans;
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) {char c; cin >> c;a[i][j] = (c == 'F');}for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) if (a[i][j]) h[i][j] = h[i - 1][j] + 1;top = 0;for (int j = 1; j <= m; ++j) {while (top > 0 && h[i][sta[top]] > h[i][j]) {r[i][sta[top]] = j;--top;}sta[++top] = j;}while (top > 0) {r[i][sta[top]] = m + 1;--top;}top = 0;for (int j = m; j >= 1; --j) {while (top > 0 && h[i][sta[top]] > h[i][j]) {l[i][sta[top]] = j;--top;}sta[++top] = j;}while (top > 0) {l[i][sta[top]] = 0;--top;}for (int j = 1; j <= m; ++j)ans = max(ans, h[i][j] * (r[i][j] - 1 - l[i][j]));}// 这个不用特判// 因为若全是 R, 每一个 h[i][j] 都为 0printf("%d\n", ans * 3);return 0;
} 

2.障碍点法

一般用在平面直角坐标系中,时间复杂度与障碍点个数有关,为 O ( n 2 ) O(n^2) O(n2)
可以看看这篇题解。

#include <bits/stdc++.h>#define mkpr make_pairusing namespace std;typedef long long ll;
typedef pair<int, int> pii;const int maxn = 5e3 + 7;int L, W, n;
struct point {int x, y;point() {}point(int _x, int _y) : x(_x), y(_y) {}
} p[maxn];
bool cmp1(point a, point b) {return a.x < b.x;}
bool cmp2(point a, point b) {return a.y < b.y;}
int ans;
int main() {scanf("%d%d%d", &L, &W, &n);for (int i = 1; i <= n; ++i)scanf("%d%d", &p[i].x, &p[i].y);p[++n] = point(0, 0), p[++n] = point(L, 0);p[++n] = point(0, W), p[++n] = point(L, W);sort(p + 1, p + n + 1, cmp1);// 从左往右扫 for (int i = 1; i <= n; ++i) {int up = W, down = 0;for (int j = i; j <= n; ++j) {while (p[i].x == p[j].x && j <= n) ++j;if (j > n) break;ans = max(ans, (up - down) * (p[j].x - p[i].x));if (p[i].y <= p[j].y) up = min(up, p[j].y);if (p[i].y > p[j].y) down = max(down, p[j].y);}}// 从右往左扫for (int i = n; i >= 1; --i) {int up = W, down = 0;for (int j = i; j >= 1; --j) {while (p[i].x == p[j].x && j >= 1) --j;if (j < 1) break;ans = max(ans, (up - down) * (p[i].x - p[j].x));if (p[i].y <= p[j].y) up = min(up, p[j].y);if (p[i].y > p[j].y) down = max(down, p[j].y);}	}sort(p + 1, p + n + 1, cmp2);// 特殊情况:小矩形左右边与大矩形左右边重合 for (int i = 1; i <= n - 1; ++i)ans = max(ans, L * (p[i + 1].y - p[i].y)); printf("%d\n", ans);return 0;
}

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

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

相关文章

2024年河北省职业院校技能大赛 “信息技术应用创新赛项”(高职组)样题解法

​有问题请留言或主页私信咨询 2024年河北省职业院校技能大赛 “信息技术应用创新赛项”&#xff08;高职组&#xff09;样题 一、初始化环境 1.账号及默认密码如表1所示。 表1 账号及密码规划表 账 号密 码root&#xff08;服务端&#xff09;kylin2024!desk&#xff08…

gozero获取数据库内容报错解决方案与实践

这个错误通常出现在 Go 语言的数据库查询中&#xff0c;表示你尝试将一个不支持的数据类型&#xff08;[]uint8&#xff0c;即字节切片&#xff09;存储到一个 Go 类型&#xff08;*time.Time&#xff09;中。具体来说&#xff0c;create_time 列的类型可能是 DATETIME 或 TIME…

【学习笔记15】如何在非root服务器中,安装属于自己的redis

一、下载安装包 官网下载黑马程序员给的安装包&#xff08;redis-6.2.6&#xff09; 二、将安装包上传至服务器 我将安装包上传在我的文件夹/home/XXX&#xff0c;指定路径中/src/local/redis/&#xff0c;绝对路径为/home/XXX/src/local/redis/解压安装包 XXXomega:~$ cd …

PotPlayer 配置安装

文章目录 一、下载1、官网链接2、微软商店 Microsoft Store 二、安装1、双击安装包2、选择字体3、安装向导下一步4、接收许可协议5、选择组件及关联6、选择安装位置7、硬解选项 三、设置1、关闭自动更新2、左键单双击设置3、视频下自动隐藏3.1、效果对比 4、播放信息显示设置4.…

【PCIe 总线及设备入门学习专栏 2 -- PCIe 的 LTSSM 和 Enumeration】

文章目录 OverviewLTSSM StatesDetect StatesDETECT_QUIETDETECT_ACTDETECT_WAITPolling StatesPOLL_ACTIVEPOLL_CONFIGPOLL_COMPLIANCEConfiguration StatesCONFIG_LINKWD_STARTCONFIG_LINKWD_ACCEPTCONFIG_LANENUM_WAITCONFIG_LANENUM_ACCEPTCONFIG_COMPLETECONFIG_IDLERecov…

STM32 FreeROTS Tickless低功耗模式

低功耗模式简介 FreeRTOS 的 Tickless 模式是一种特殊的运行模式&#xff0c;用于最小化系统的时钟中断频率&#xff0c;以降低功耗。在 Tickless 模式下&#xff0c;系统只在有需要时才会启动时钟中断&#xff0c;而在无任务要运行时则完全进入休眠状态&#xff0c;从而降低功…

【机器学习实战中阶】书籍推荐系统

图书推荐系统机器学习项目 通过这个机器学习项目&#xff0c;我们将构建一个图书推荐系统。对于这个项目&#xff0c;我们将使用 K 最近邻&#xff08;K-Nearest Neighbor, KNN&#xff09;算法。 让我们开始构建这个系统。 数据集说明 关于数据集 背景 在过去的几十年中…

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础 目录 1.NAND FLASH 和NOR FLASH异同 ? 2.CPU,MPU,MCU,SOC,SOPC联系与差别? 3.什么是交叉编译&#xff1f; 4.为什么要交叉编译&#xff1f; 5.描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别? 1…

【数据分享】1929-2024年全球站点的逐月平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正 1 添加依赖2 测试代码3 测试结果 在OpenCV中&#xff0c;仿射变换&#xff08;Affine Transformation&#xff09;和透视变换&#xff08;Perspective Transformation&#xff09;是两种常用的图像几何变换方法。 变换方…

电梯系统的UML文档07

从这个类中得到的类图&#xff0c;构划出了软件的大部分设计。 系统结构视图提供软件和整个系统结构最复杂的也是最优雅的描述。和通常的软件系统相比&#xff0c;在分布式嵌入系统中了解系统组件如何协同工作是非常重要的。毕竟&#xff0c;每个类图仅仅是一个系统的静态设计…

文本摘要研究:从统计方法到大型语言模型

论文地址&#xff1a;https://arxiv.org/pdf/2406.11289 &#x1f4d6; 文本摘要研究&#xff1a;从统计方法到大型语言模型 近年来&#xff0c;文本摘要研究经历了多次重大变革&#xff0c;从深度神经网络的出现到预训练语言模型&#xff08;PLMs&#xff09;&#xff0c;再到…

MYSQL 5.7数据库,关于1067报错 invalid default value for,解决方法!

???作者&#xff1a; 米罗学长 ???个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 ???各类成品java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot&#xff0c;mysql等项目&#xff0c;源码丰富&#xff0c;欢迎咨询。 ???…

C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例

什么是CPPCMS&#xff1f; CppCMS 是一个高性能的 C Web 开发框架&#xff0c;专为构建快速、动态的网页应用而设计&#xff0c;特别适合高并发和低延迟的场景。其设计理念类似于 Python 的 Django 或 Ruby on Rails&#xff0c;但针对 C 提供了更细粒度的控制和更高效的性能。…

一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用

一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用 1. 建议按文章顺序从头看是看 第一篇&#xff1a;一文大白话讲清楚啥是个webpack第二篇&#xff1a;一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建然后看本篇&#xff0c;Loader的配置…

Kafka 日志存储 — 日志索引

每个日志分段文件对应两个索引文件&#xff1a;偏移量索引文件用来建立消息偏移量到物理地址之间的映射&#xff1b;时间戳索引文件根据指定的时间戳来查找对应的偏移量信息。 1 日志索引 Kafka的索引文件以稀疏索引的方式构造消息的索引。它并不保证每个消息在索引文件中都有…

空调可视化监控与管理系统

随着智能化技术的不断发展&#xff0c;空调系统作为现代建筑、工业和商业场所的核心设备&#xff0c;正在从传统管理模式向智能化管理迈进。无论是大型商业楼宇、工业厂房&#xff0c;还是数据中心的精密空调&#xff0c;如何通过智能监控和高效管理降低能耗、提升运行效率&…

用户中心项目教程(五)---MyBatis-Plus完成后端初始化+测试方法

文章目录 1.数据库的链接和创建2.建库建表语句3.引入依赖4.yml配置文件5.添加相对路径6.实体类的书写7.Mapper接口的定义8.启动类的指定9.单元测试10运行时的bug 1.数据库的链接和创建 下面的这个就是使用的我们的IDEA链接这个里面的数据库&#xff1a; 接下来就是输入这个用户…

Mysql InnoDB B+Tree是什么?

“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线&#xff0c;将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…

对人型机器人的研究和展望

目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问&#xff1a;当前那个行业最火&#xff1f;毫无疑问答案肯定是人型机器人了。当前各类机…