单调栈解决取矩形问题

​ 前言:这一类问题不知道是什么问题,emmm大概意思就是从一个混合着可行点和不可行点的矩形中能取出的充满可行点的矩形的数目。这一类问题应该有一个官方的名字,大家如果知道可以在评论区中给出。

一 思想概括

对于这样的一个数据,其中1为可行点,求最多能得到多少个矩形

1 0 1 0
1 1 1 0
1 1 1 1

​ 设 a [ i ] [ j ] a[i][j] a[i][j]点的向上的可拓展的高度为 h h h,那么我们要查找的就是在此高度范围内包含 a [ i ] [ j ] a[i][j] a[i][j]点的长方形数目,因此我们要得到这个高度在左右两边可以拓展到哪里,设在左边第一个高度小于等于 h h h的位置为 l l l,右边第一个高度小于 h h h的位置为r,可以得到方案总数为 ( i − l ) ∗ ( r − i ) ∗ h (i-l)*(r -i)*h (i−l)∗(r−i)∗h

​ 之所以两边不一样是因为我们要避免重复的计算,比如在这样一个格局中,如果我们选择两边都是小于,则会出现重复的计算在第一次时计算得到的是 3 ∗ 1 ∗ 3 3 * 1*3 3∗1∗3,第二次是 2 ∗ 2 ∗ 3 2 * 2*3 2∗2∗3,包含所有点的一种以及其他几种被反复运算。

1 1 1
1 1 1
1 1 1

二 单调栈的实现

​ 单调栈的思想就是如果你比别人时间更长并且更菜,那么你就被取代,并且新人只能从新向旧不断挑战,而你会被标记上打败你的人的序号

int index[N];
for(int i = 1;i <= n;i++)
{while(!stack_empty&&h[i] < h[stack[top]]) index[stack_top] = i, stack_pop;stack_push(i);
}

​ 通过单调栈的使用我们可以得到一个点的左(右)第一个大于(小于)的数字的位置

三 code

#include<iostream>
#define N 1010
using namespace std;
int r[N],l[N],h[N],d[N][N],n,m,k[N],ans;
void dql()
{int top = 0;for(int i = m;i >= 1;i--){while(top&&h[i] <= h[k[top]]) l[k[top]] = i,top--;top++;k[top] = i;}while(top) l[k[top]]=0,top--;top = 0;for(int i = 1;i <= m;i++){while(top&&h[i] < h[k[top]]) r[k[top]] = i,top-top++;k[top] = i;}while(top) r[k[top]]=m+1,top--;for(int i = 1;i <= m;i++){ans += h[i]*(i - l[i])*(r[i] - i);}return;
}
int main()
{scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++)for(int j = 1;j <= n;j++){char temp;cin>>temp;if(temp=='*') d[i][j] = 1;}for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){if(d[i][j]) h[j] = 0;else h[j]++;}}printf("%d",ans);
}

单调栈解决取矩形问题相关推荐

  1. 2022-11-16 每日打卡:单调栈解决最大矩形问题(一维直方图,二维最大红矩形)

    每日打卡:单调栈解决最大矩形问题(一维直方图,二维最大红矩形) 柱状图中最大的矩形 思路 这个题最明显的思路就是:矩形面积=底×高. 版本1:底的长度可以通过二重循环来完成,高通过循环来寻找最小值. ...

  2. 的input最大长度_LeetCode 84 | 单调栈解决最大矩形问题

    今天是LeetCode专题第52篇文章,我们一起来看LeetCode第84题,Largest Rectangle in Histogram(最大矩形面积). 这道题的官方难度是Hard,点赞3581, ...

  3. 将一个数组中的值按逆序重新排放。_六十五、下一个更大的数系列,单调栈解决方法...

    「@Author:Runsen」 ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. 「---- Runsen」 ❞ 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校 ...

  4. 洛谷P4147 玉蟾宫(单调栈解决)

    题目 题目链接 题目背景 有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成 N\times ...

  5. 【栈】python、单调栈解决收集雨水问题、力扣42题

    以下是leetcode 42原题: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例 1: 输入:height = [0,1,0,2,1,0,1 ...

  6. 单调栈解决维持相对位置不变最小/最大字典序问题

    多次碰到这类维持相对位置不变,删除某些元素维持最小or最大字典序问题,这里记录一下: 首先给出一个经典的例子: 我们想要维持最小或者最大,无非是要保持相对有序的情况下,保持一个递增或者递减栈,其实就是 ...

  7. 使用单调栈解决接雨水问题——LeetCode 42 接雨水+单调栈说明

    题目内容 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输 ...

  8. 六十五、下一个更大的数系列,单调栈解决方法

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校的2020新生. ...

  9. 51Nod 1102 面积最大的矩形 +1272 最大距离 单调栈

    51Nod 1102 面积最大的矩形 记笔记记笔记:对于区间最值与区间长度/和等的问题,用单调栈来维护区间端点. 这里来补一补单调栈和单调队列的基础知识: 单调栈:                   ...

最新文章

  1. 2020年人工神经网络第二次作业
  2. 【小米3使用经验】小米3联通版 miui7.2.11稳定版刷机
  3. shell变量,管道符,作业控制,shell变量,以及变量配置文件
  4. html 使用ajax php函数吗,php – 为什么用AJAX加载html后jQuery更改函数不起作用?
  5. Html5 学习笔记 --》html基础 css 基础
  6. 将多选框中的值,用String接收,并用‘,’隔开,到后台去循环这个数据
  7. 1组第一次作业-小组自我介绍
  8. 何时及为何使用代表? [重复]
  9. hive变量传递的源码实现
  10. Intellij idea注册激活码(2017年2月15日亲测可用于最新版)
  11. 学而思python小学生课程_幼升小之路(26) 学而思测评
  12. Laravel 事件监听
  13. STM32 | STM32CubeMX基础之TIM
  14. android 表情字符串,Android 显示输入法中的emoji表情以及String字符串转码
  15. 2018 ACM-ICPC 亚洲区域赛青岛站 E - Plants vs. Zombies(二分)
  16. 对称、群论与魔术(九)——魔术《五边形的奇迹》
  17. 进程控制块pcb详解
  18. Oracle 12c中增强的PL/SQL功能
  19. 联想卡在logo界面_联想电脑卡在logo界面 联想电脑卡在载入界面怎么办
  20. android 左右声道,Android左右声道的控制

热门文章

  1. java基础热门侠客养成_有了《侠客养成手册》,做大侠原来这么简单
  2. PY4E 作业练习 答案代码 exercises answer code
  3. [油猴脚本开发指南]h5视频倍速,时间加速和run-at
  4. gup云服务器,腾讯GPU 云服务器 - 腾佑云计算
  5. 星巴克凭什么在中国卖得比美国还贵?
  6. iview UI的Table组件数据刷新但是页面不刷新的问题
  7. kb mac压缩图片大小_图片格式及如何压缩图片的字节大小(kb)
  8. 该怎么用设计测试用例测网上银行转账?
  9. GateWay 网关路由过滤器配置
  10. ARS系列毫米波雷达技术一览