POJ2559 POJ2082 POJ3494(最大矩形面积 单调栈)

最大矩形面积问题——单调栈法 最大矩形面积问题——单调栈法 文章目录最大矩形面积问题——单调栈法直方图最大矩形面积分析单调栈法过程示例代码示例矩阵中最大的矩形分析代码示例 直方图最大矩形面积 题目地址 给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10 示例2 输入: heights = [ 阅读详情

POJ2559

    这是最基本的,宽度都为1,只需考虑高度即可。对于每个矩形,我们从它往左开始找到第一个高度小于它的,记找到的左界为Li,同理,找到的右界为Ri,则以这个举行为基准找到的最大矩形面积为Hi*(Ri-Li+1)。寻找边界的过程可以用一个单调栈来高效地完成。

#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<iostream>
#include<set>
#include<map>
#include<cmath>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#define fin(a) freopen("a.txt","r",stdin)
#define fout(a) freopen("a.txt","w",stdout)
typedef long long LL;
using namespace std;
const int INF = 1e8 + 10;
const int maxn = 1e5 + 10;
int h[maxn], st[maxn], L[maxn], R[maxn];
int n;
int main() {
  while(scanf("%d", &n) && n) {
    for(int i = 1; i <= n; i++) scanf("%d", &h[i]);
    int t = 0;
    for(int i = 1; i <= n; i++) {
      while(t > 0 && h[st[t-1]] >= h[i]) t--;
      L[i] = (t == 0 ? 1 : st[t-1]+1);
      st[t++] = i;
    }
    t = 0;
    for(int i = n; i >= 1; i--) {
      while(t > 0 && h[st[t-1]] >= h[i]) t--;
      R[i] = (t == 0 ? n : st[t-1]-1);
      st[t++] = i;
    }
    LL ans = 0;
    for(int i = 1; i <= n; i++) {
      ans = max(ans, (LL)h[i] * (LL)(R[i]-L[i]+1));
    }
    cout << ans << endl;
  }
  return 0;
}


POJ 2082

    这个和上题唯一的不同是,每个矩形的宽度不定,只要在最后计算时注意一下宽度即可。

#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<iostream>
#include<set>
#include<map>
#include<cmath>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<bitset>
#include<algorithm>
#define fin(a) freopen("a.txt","r",stdin)
#define fout(a) freopen("a.txt","w",stdout)
typedef long long ll;
using namespace std;
const int maxn = 50005;
int h[maxn], w[maxn], st[maxn], L[maxn], R[maxn];
int n;

ll solve() {
  ll ans = 0;
  int t = 0;
  for(int i = 1; i <= n; i++) {
    while(t > 0 && h[st[t-1]] >= h[i]) t--;
    L[i] = (!t ? 1 : st[t-1]+1);
    st[t++] = i;
  }
  t = 0;
  for(int i = n; i >= 1; i--) {
    while(t > 0 && h[st[t-1]] >= h[i]) t--;
    R[i] = (!t ? n : st[t-1]-1);
    st[t++] = i;
  }
  for(int i = 1; i <= n; i++) {
    int W = w[R[i]] - w[L[i]-1];
    ans = max(ans, (ll)W*h[i]);
  }
  return ans;
}

int main() {
  while(scanf("%d", &n) && n+1) {
    for(int i = 1; i <= n; i++) {
      scanf("%d%d", &w[i], &h[i]);
      w[i] += w[i-1];
    }
    printf("%lld\n", solve());
  }
  return 0;
}

POJ 3494
    给一个01矩阵,找一个最大的子矩阵,使得其中所有元素都为一。

   我们可以以每一行为基准线,求以这一行为底的最大矩形面积,则每个小矩形的高为,从他开始往上找到的连续1的个数(直到第一个0出现为止)。

#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<iostream>
#include<set>
#include<map>
#include<cmath>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#define fin(a) freopen("a.txt","r",stdin)
#define fout(a) freopen("a.txt","w",stdout)
typedef long long ll;
using namespace std;
const int INF = 1e8 + 10;
const int maxn = 2005;
int a[maxn][maxn], h[maxn], L[maxn], R[maxn], st[maxn];
int r, c;

int solve() {
  int ans = 0;
  int t = 0;
  for(int i = 1; i <= c; i++) {
    while(t > 0 && h[st[t-1]] >= h[i]) t--;
    L[i] = (!t ? 1 : st[t-1]+1);
    st[t++] = i;
  }
  t = 0;
  for(int i = c; i >= 1; i--) {
    while(t > 0 && h[st[t-1]] >= h[i]) t--;
    R[i] = (!t ? c : st[t-1]-1);
    st[t++] = i;
  }

  for(int i = 1; i <= c; i++)
    ans = max(ans, h[i] * (R[i]-L[i]+1));
  return ans;
}

int main() {
  while(scanf("%d%d", &r, &c) == 2) {
    int mx = 0;
    for(int i = 1; i <= r; i++) {
      for(int j = 1; j <= c; j++) {
        scanf("%d", &a[i][j]);
        h[j] = (a[i][j] ? h[j]+1 : 0);
      }
      mx = max(mx, solve());
    }
    printf("%d\n", mx);
  }
  return 0;
}



面积最大的矩形(单调栈问题) 题目:有N个矩形,宽度都为1,给出N个矩形的高度,求由这N个矩形组成的图形包含的最大的矩形面积。 分析:对于每个矩形,我们求出它向左向右分别能延伸的长度,然后乘以它的高度,这就是以当前矩形为最低高度可以得到的最大的面积。 对于输入数据input,对于其每个数input[i] 1、如果栈为空或input[i] 大于等于input[st.top] , 则入栈 i,否则将大于入栈元素的栈顶元素出栈... 阅读详情

相关推荐

c++单调栈实现最大矩形面积

题意 给一个直方图,求直方图中的最大矩形的面积。例如,下面这个图片中直方图的高度从左到右分别是2, 1, 4, 5, 1, 3, 3, 他们的宽都是1,其中最大的矩形是阴影部分。 Input 输入包含多组数据。每组数据用一个整数n来表示直方图中小矩形的个数,你可以假定1 <= n <= 100000. 然后接下来n个整数h1, …, hn, 满足 0 <= hi <= 1...

txzhangZz的博客 2846

单调栈——最大矩形面积

#include<iostream> #include<string.h> using namespace std; int a[100010]; int s[100010]; int l[100010]; int main() { int n; while(scanf("%d",&n)!=EOF&&n!=0) { long l...

weixin_43517157的博客 2231

单调栈--最大矩形的面积

问题: 给一个直方图,求直方图中的最大矩形的面积。例如,下面这个图片中直方图的高度从左到右分别是2, 1, 4, 5, 1, 3, 3, 他们的宽都是1,其中最大的矩形是阴影部分。 input: 输入包含多组数据。每组数据用一个整数n来表示直方图中小矩形的个数,你可以假定1 <= n <= 100000. 然后接下来n个整数h1, …, hn, 满足 0 <= hi <=...

kai2000的博客 2023

矩形最大面积与接雨水——单调栈

给定一组矩形,要求得最大的子矩形大小,这是一道典型的单调栈问题。我们使用单调栈,首先插入一个-1,方便代码的编写。然后将矩形下标一个一个入栈,如果当前元素大于栈顶元素,就可以加入,如果小于栈顶元素,就要开始计算面积了。基本就是用到了单调栈的特性,当一个元素出栈时,以这个元素作为高,只有处在他后面的元素可以扩展,所以宽度就是 当前要入栈元素下标-(当前元素出栈后下一个元素的下标+1),因为当前元素出栈后,下一个元素一定是<= 当前出栈元素,无法满足出栈元素的高度。

volcan的博客 569

Leetcode85:最大矩形

题目:给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 难度:困难 解题思路: class Solution: def maximalRectangle(self, matrix: List[List[str]]) -> int: if not matrix:return 0 m,n=len(matrix),len(matrix[0]) # 记录当前位置上方连续.

qq_42600675的博客 461

单调栈--leetcode 84 柱状图中最大的矩形

单调栈指的是存储一些数据到栈中,同时这些数据满足单调递增或是单调递减显然是有四种情况的:1:向左找第一个比自身大的数。2:向左找第一个比自身小的数。3:向右找第一个比自身大的数。4:向右找第一个比自身小的数。

manfulshark的博客 1478

最大矩形面积——单调栈

问题描述 给一个直方图,求直方图中的最大矩形的面积。例如,下面这个图片中直方图的高度从左到右分别是2, 1, 4, 5, 1, 3, 3, 他们的宽都是1,其中最大的矩形是阴影部分。 Input 输入包含多组数据。每组数据用一个整数n来表示直方图中小矩形的个数,你可以假定1 <= n <= 100000. 然后接下来n个整数h1, …, hn, 满足 0 <= hi <=...

weixin_44203022的博客 1203

强化学习经典算法笔记(九):LSTM加持的PolicyGradient算法

强化学习经典算法笔记(九):LSTM加持的PolicyGradient算法 在上文《强化学习经典算法笔记(八):LSTM加持的A2C算法解决POMDP问题》的基础上,实现了LSTM+MLP的Policy Gradient算法。 实现过程如下: import argparse, math, os, sys import numpy as np import gym from gym import wrappers import matplotlib.pyplot as plt import torch fr

hhy_csdn的博客 5636

Leetcode No.85 最大矩形(单调栈)

一、题目描述 给定一个仅包含0和1、大小为rows x cols的二维二进制矩阵,找出只包含1的最大矩形,并返回其面积。 示例 1: 输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] 输出:6 解释:最大矩形如上图所示。 示例 2: 输入:matrix = [] 输出:0 示例 3: 输入:matrix = [["0"]] 输...

713

从零到一:手把手教你构建自定义ReaxFF力场参数

本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。

weixin_28365523的博客 1059

《探秘 BME680温度湿度气压气体传感器模块:环境感知的卓越之选》:此文为AI自动生成

BME680 是一款由博世公司推出的集成环境传感器模块,在环境监测和物联网等领域中发挥着重要作用。它能够同时测量温度、湿度、气压和气体浓度等多个环境参数,为各种应用提供准确可靠的环境数据。该模块采用小巧的封装形式,便于集成到各种设备中,无论是智能家居、可穿戴设备还是工业监测系统,都能轻松适配。例如,在智能家居系统中,BME680 模块可以监测室内环境参数,如温度、湿度、气压和空气质量等。通过与智能家居控制器或智能手机应用程序的连接,用户可以实时了解室内环境状况,并根据需要进行调整。

zheng_ruiguo的专栏 1868

23种设计模式-中介者(Mediator)设计模式

软考中级-软件设计师 中介者设计模式

片言可决讼,半纸能缚龙 1865

单调栈 & 单调队列 【专辑@AbandonZHANG】

单调栈 or 单调队列,是指序列中的元素严格递增 or 递减。可以解决一些区间上基于比较的一些题目,下面用一些经典的题目中来具体讨论. 单调栈 应用:求以某个值为下界(上界)的最大区间 RQNOJ 460诺诺的队列 题意:有一个N个数的序列,求出所有的数对数(x,y)---x,y相邻或者它们之间没有比它们大的数. 分析:x,y两个数只算一次,所以我们不妨只按右边考虑,即对于任...

weixin_30237281的博客 75

ENVI预处理GF-1号WFV1遥感数据提取NDVI指数

使用ENVI处理GF-1号遥感数据提取NDVI指数

所有专家都曾始于新手 8179

NVIDIA A100驱动及CUDA安装指南

NVIDIA A100驱动及CUDA安装指南:详细介绍了在Ubuntu系统下安装A100显卡驱动和CUDA工具包的完整流程,包括环境准备、驱动安装、CUDA配置及性能优化建议。特别推荐猿界算力平台提供开箱即用的A100算力租赁服务,具备专业团队支持、灵活租期和实惠价格等优势。文末通过PyTorch测试验证了A100设备的可用性,展示了80GB显存的强大计算能力。

2401_89353317的博客 1511

每日一题——面积最大的矩形(单调栈)

what is 单调栈?

Cooler_z的博客 791

5.6华为OD机试真题 新系统 - 匹配命令行前缀关键字 (Java/Py/C/C++/Js/Go)

5.6华为OD机试真题 新系统 - 匹配命令行前缀关键字本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2129

栈操作之单调栈III

之后遍历元素1,此时栈顶元素2大于当前遍历元素1,需要将栈中大于1的所有元素对应的下标出栈,进入else,进入while循环,将栈顶下标1出栈,mid = 1,对应的值为2,i为2,对应的值为1,stack.peek()为0,对应的值为0,也就是左侧柱子高度为0,中间高度为2,右侧柱子高度为1,计算三根柱子围成的面积。此时stack为[0],对应的值为[0],由于0小于1,元素0不需要出栈,最后将元素1对应的下标压入栈中,stack为[2, 0],对应的值为[1, 0]。每个柱子彼此相邻,且宽度为 1。

qq_43552690的博客 1428

前端技能树,面试复习第 54 天—— 手写代码:情景题

前端修罗场提供全网最专业的前端优质文章与社区服务,为应届生,初中级前端工程师提供全面、优质的面试服务、技能提升、职场解惑服务!内容包含:前端面试辅导,前端面试题,前端交流,前端答疑,前端基础知识,前端知识体系,技能树搭建,Javascript,CSS,CSS3,HTML,React,Vue,小程序,前端简历,职业交流,远程工作,英文交流,英文提升,外企,互联网,国企,大厂,牛客面试题,掘金面试题,面经,优质前端文章分享...

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 986

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

22 | 栈与单调栈:最大矩形面积

上节课我们讲了单调队列这种具有单调性的结构,并且说明了单调队列适合:维护中的区间最大值,并且我还提到单调队列只是一个铺垫,搞清楚了单调队列的内容,才能更好地学习新的数据结构。今天将带你学习一种队列和单调队列的兄弟数据结构,它的性质也很有趣,就是:栈与单调栈。学习这个数据结构的时候呢,我还是要再次强调一下那句话:数据结构,就是定义一种性质,并且维护这种性质。

qq_37756660的博客 1343

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C++】单调栈求最大矩形面积

选做题(单调栈的应用): 给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 图 1柱状图示例 图1是柱状图的示例,给定的高度为,所能勾勒出来的矩形如图2所示,这些矩形最大面积为10(对应从左数第3个矩形)。 图 2所能勾勒出来的矩形 样例输入: 21...

Mitchell_Donovan的博客 1481

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【搞定算法】单调栈问题:直方图中的最大矩形面积、求最大子矩阵的大小、可见山峰问题

目 录: 1、单调栈结构 1.1、单调栈结构的实现:无重复元素 1.2、单调栈结构的实现:有重复元素 2、单调栈结构的应用 2.1、直方图中的最大矩形面积 2.2、求最大子矩阵的大小 2.3、可见山峰问题 本文主要用于讲解一种在面试笔试中经常使用到的一种算法结构:单调栈结构。 1、单调栈结构 单调栈结构:给一个数组,求任何位置左边和右边离它最近的比它大/小的数。 要求:栈...

Java学习 3043

【暖*墟】 #单调栈# 最大矩形面积 poj 2559

栈的特征与运用 push(): 向栈内压入一个成员; pop(): 从栈顶弹出一个成员; empty(): 如果栈为空返回true,否则返回false; top(): 返回栈顶,但不删除成员; size(): 返回栈内元素的个数; #include&lt;iostream&gt; #include&lt;stack&gt; using namespace std; int main(...

flora715的博客 316
上一篇: POJ 1094 Sorting It All Out (拓扑排序,有向图判环)
下一篇: POJ 3321 Apple Tree (树状数组)
Interstellar_
博客等级 码龄10年 8粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值