最大矩阵面积问题


问题概述

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

  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.rhkb.cn/news/4758.html

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

相关文章

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…

多级缓存 JVM进程缓存

目录 多级缓存 1.什么是多级缓存 2.JVM进程缓存 2.1 导入案例 2.2 初识Caffeine 2.3 实现JVM进程缓存 2.3.1 需求 2.3.2 实现 3.Lua语法入门 3.1 初识Lua 3.1 HelloWorld 3.2.变量和循环 3.2.1 Lua的数据类型 3.2.3 循环 3.3 条件控制、函数 3.3.1 函数 3.3.2 条件控制 3.3.3 案…

记录一下OpenCV Contrib 编译踩的坑

最近有需要采用OpenCV Contrib 里面的函数做一下处理&#xff0c;要重新编译&#xff0c;一路编译两三个小时了&#xff0c;记录一下备忘吧。 1、编译前先准备好如下环境 ①visual studio已安装&#xff0c;具体版本和型号根据需求经验来&#xff0c;我看常用的是VS2015、VS201…

每日一刷——1.20——准备蓝桥杯

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目一 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次&#xff0c;在数20中出现1次&a…

整数的分离与合成

整数的分离与合成 一、整数的分离1.1 整数拆成数字的方法1.1.1 取尾法1.1.2 取头法 1.2 任意整数的分离 二、整数的合成 整数是由数字和数位组成的&#xff0c;比如327是一个三位数&#xff0c;它的数字是3、2、7,数位是个数、十位、百位。 经常有些题目考查将一个整数拆分成各…

动态规划(多状态)

面试题 17.16. 按摩师 面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int massage(vector<int>& nums) {int n nums.size();//特殊情况&#xff1a;空数组if(n0)return 0;vector<int> f(n);vector<int> g(n);…

【json_object】mysql中json_object函数过长,显示不全

问题&#xff1a;json只显示部分 解决&#xff1a; SET GLOBAL group_concat_max_len 1000000; -- 设置为1MB&#xff0c;根据需要调整如果当前在navicat上修改&#xff0c;只有效本次连接和后续会话&#xff0c;重新连接还是会恢复默认值1024 在my.ini配置文件中新增或者修…

ElasticSearch DSL查询之高亮显示

什么是高亮显示&#xff1f; 高亮显示是指在搜索结果中&#xff0c;将用户搜索的关键字突出显示&#xff0c;使其更为醒目。以百度搜索为例&#xff0c;当用户搜索“JAVA”时&#xff0c;搜索结果中的标题或概述部分会将“JAVA”高亮显示&#xff0c;通常以红色标出&#xff0…

WGAN - 瓦萨斯坦生成对抗网络

1. 背景与问题 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…

低代码系统-产品架构案例介绍(五)

接上篇&#xff0c;某搭介绍。 某搭以低代码为核心驱动&#xff0c;利用AI能力强势推动应用深度体验&#xff0c;打通钉钉对接&#xff0c;且集成外部系统。 可以看出&#xff0c;某搭在未来的规划上&#xff0c;着重在于AI 也就说明&#xff0c;低代码产品在未来的竞争上&…

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

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

学习记录之原型,原型链

构造函数创建对象 Person和普通函数没有区别&#xff0c;之所以是构造函数在于它是通过new关键字调用的&#xff0c;p就是通过构造函数Person创建的实列对象 function Person(age, name) {this.age age;this.name name;}let p new Person(18, 张三);prototype prototype n…

迈向 “全能管家” 之路:机器人距离终极蜕变还需几步?

【图片来源于网络&#xff0c;侵删】 这是2024年初Figure公司展示的人形机器人Figure 01&#xff0c;他可以通过观看人类的示范视频&#xff0c;在10小时内经过训练学会煮咖啡&#xff0c;并且这个过程是完全自主没有人为干涉的&#xff01; 【图片来源于网络&#xff0c;侵删】…

海康工业相机的应用部署不是简简单单!?

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 笔者使用的设备及环境&#xff1a;WSL2-Ubuntu22.04MV-CS016-10UC 不会吧&#xff1f;不会吧&#xff1f;不会还有人拿到海康工业相机还是一脸懵叭&#xff1f;不会还有人…

【自动控制原理】非线性系统 描述函数法 相平面法

写在前面&#xff08;叠甲&#xff09;&#xff1a; 非线性是控制科学中重要的一个研究方向&#xff0c;它所包含的理论远远超过自动控制原理中的内容。在本文中&#xff0c;所介绍的内容仍然在《自动控制原理》框架内&#xff0c;所以只介绍了自控原理课程中涉及的非线性问题&…

three.js实现裸眼双目平行立体视觉

three.js实现裸眼双目平行立体视觉原理&#xff1a; 利用两个相机、两个渲染器&#xff0c;同时渲染同一个场景。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"…

N个utils(sql)

sql&#xff0c;操作数据库的语言&#xff0c;也可以叫做数据库软件的指令集吧。名字而已&#xff0c;无所谓啦。 本质上&#xff0c;sql并不是java语言内的范畴。但却是企业级开发的范畴。并且我整个文章的一篇逻辑的本质&#xff0c;层的概念&#xff0c;其中一个大的层级就…

工业网口相机:如何通过调整网口参数设置,优化图像传输和网络性能,达到最大帧率

项目场景 工业相机是常用与工业视觉领域的常用专业视觉核心部件&#xff0c;拥有多种属性&#xff0c;是机器视觉系统中的核心部件&#xff0c;具有不可替代的重要功能。 工业相机已经被广泛应用于工业生产线在线检测、智能交通,机器视觉,科研,军事科学,航天航空等众多领域 …

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

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

pytest+playwright落地实战大纲

前言 很久没有更新博客&#xff0c;是因为在梳理制作Playwright测试框架实战相关的课程内容。现在课程已经完结&#xff0c;开个帖子介绍下这门课程&#xff08;硬广, o(〃&#xff3e;▽&#xff3e;〃)o&#xff09; 课程放在CSDN学习频道&#xff0c; 欢迎关注~ PyTestPl…