单调栈和队列讲解:传送门

HDU -1506题意:

就是给你一些矩形的高度,让你统计由这些矩形构成的那个矩形面积最大

如上图所示,如果题目给出的全部是递增的,那么就可以用贪心来解决

从左向右依次让每一个矩形的高度当作最后的高度,来从中选取最大值就可以了

但是如果它不是递增的,中间会出现低谷,那么要还想运用贪心策略就要把之前高度大于它的全部扔掉,但是再扔掉他们之前还要判断一下以他们为最后答案的高度可不可行,这样我们就是在构造一个递增序列,可以用栈来维护它

代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<queue>
5 #include<algorithm>
6 #include<vector>
7 #include<stack>
8 using namespace std;
9 const int maxn=100080;
10 int n,height[maxn],width[maxn],Stack[maxn],top=0;
11 long long work()
12 {
13 long long ans=0;
14 for(int i=1;i<=n+1;++i)
15 {
16 if(height[i]>Stack[top])
17 {
18 Stack[++top]=height[i];
19 width[top]=1;
20 }
21 else
22 {
23 int widthsum=0;
24 while(Stack[top]>height[i])
25 {
26 widthsum+=width[top];
27 ans=max(ans,(long long)widthsum*Stack[top]);
28 top--;
29 }
30 Stack[++top]=height[i];
31 width[top]=widthsum+1;
32 }
33 }
34 return ans;
35 }
36 int main()
37 {
38 while(~scanf("%d",&n))
39 {
40 if(!n) break;
41 for(int i=1;i<=n;++i)
42 scanf("%d",&height[i]);
43 height[n+1]=0;
44 long long ans=work();
45 printf("%lld\n",ans);
46 }
47 return 0;
48 }

传送门:51nod 1158

51nod 1158题意:

就是给你输入一个n行m列的矩形,里面由1或0构成,你要从中找出来最大的被1填充的矩形

题解:

这一道题感觉和上一个道题很相似,唯一不同的是,上一道题告诉你了高度,但是这一道题要求你自己找出来

思路:第一步还是降维操作,用a[i][j]记录以第i行为底的全1直方图的高,如对于矩阵:

1 1 1 0

0 0 1 1

1 1 0 1

1 1 1 0

对于上面这个我们可以把它转化成

1 1 1 0

0 0 2 1

1 1 0 2

2 2 1 0

这样处理后就和上一道题差不多了,因为每一行就相当于上一道题输入的那一行数据,我们只需要对这几行一一用单调栈处理就可以了

代码:

 1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 const int N = 1e5 + 7;
6
7 int n, m, x, ans;
8
9 int h[N], a[N];
10
11 stack <int> s;
12
13 int main()
14
15 {
16
17 scanf("%d%d",&m,&n);
18
19 for(int i = 0; i < m; i++)
20
21 {
22
23 for(int j = 1; j <= n; j++)
24
25 {
26
27 scanf("%d", &x);
28
29 if(x == 1) a[j] += 1;
30
31 else a[j] = 0;
32
33 h[j] = a[j];
34
35 }
36
37 s.push(0);
38
39 for(int j = 1; j <= n + 1; j++)
40
41 {
42
43 while(h[j] < h[s.top()])
44
45 {
46
47 int index = s.top();
48
49 s.pop();
50
51 int tmp = (j - 1 - s.top()) * h[index];//因为我们维护的是一个递增
52 //序列,所以目前正在枚举这个位置,跟栈顶中位置之间的全部位置的高度
53 //都是大于这个正在枚举的位置的高度
54 ans = max(ans, tmp);
55
56 }
57
58 s.push(j);
59
60 }
61
62 }
63
64 cout << ans << endl;
65
66 }

HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)的更多相关文章

  1. 51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))

    前置问题:51nod 1102 面积最大的矩形 附上链接: 51nod 1102 面积最大的矩形 这题的题解博客 需要了解的知识:单调栈,在前置问题中已经讲解. 解题思路 对每行求左边连续1的个数,得 ...

  2. HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)

    E - Largest Rectangle in a Histogram Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  3. HDU 1506 Largest Rectangle in a Histogram set+二分

    Largest Rectangle in a Histogram Problem Description: A histogram is a polygon composed of a sequenc ...

  4. hdu 1506 Largest Rectangle in a Histogram 构造

    题目链接:HDU - 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  5. HDU 1506 Largest Rectangle in a Histogram(区间DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题目: Largest Rectangle in a Histogram Time Limit: ...

  6. DP专题训练之HDU 1506 Largest Rectangle in a Histogram

    Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...

  7. Hdu 1506 Largest Rectangle in a Histogram 分类: Brush Mode 2014-10-28 19:16 93人阅读 评论(0) 收藏

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  8. hdu 1506 Largest Rectangle in a Histogram(单调栈)

                                                                                                       L ...

  9. HDU 1506 Largest Rectangle in a Histogram(DP)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

随机推荐

  1. 【Flutter】功能型组件之异步UI更新

    前言 很多时候会依赖一些异步数据来动态更新UI,比如在打开一个页面时我们需要先从互联网上获取数据,在获取数据的过程中我们显示一个加载框,等获取到数据时我们再渲染页面:又比如想展示Stream(比如文件 ...

  2. 【Flutter】容器类组件之装饰容器

    前言 DecoratedBox可以在其子组件绘制前后绘制一些装饰,例如背景,边框,渐变等. 接口描述 const DecoratedBox({ Key key, // 代表要绘制的装饰 @requir ...

  3. redis 5.0.5 安装

    redis 5.0.5 安装脚本: #!/bin/bash cd /data/src/ test -e tcl8.6.9-src.tar.gz || wget http://downloads.sou ...

  4. 你都用过SpringCloud的哪些组件,它们的原理是什么?

    前言 看到文章的题目了吗?就是这么抽象和笼统的一个问题,确实是我面试中真实被问到的,某共享货车平台的真实面试问题. SpringCloud确实是用过,但是那是三四年前了,那个时候SpringCloud ...

  5. 什么是STP

    简介 了解STP 配置STP 相关信息 简介 STP(Spanning Tree Protocol)是运行在交换机上的二层破环协议,环路会导致广播风暴.MAC地址表震荡等后果,STP的主要目的就是确保 ...

  6. Java并发包源码学习系列:阻塞队列实现之PriorityBlockingQueue源码解析

    目录 PriorityBlockingQueue概述 类图结构及重要字段 什么是二叉堆 堆的基本操作 向上调整void up(int u) 向下调整void down(int u) 构造器 扩容方法t ...

  7. 对于Spring MVC 拦截器的一些了解

    Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission lo ...

  8. oblet

      oblet - The Go Programming Language https://golang.google.cn/search?q=oblet // put enqueues a poin ...

  9. (转载)微软数据挖掘算法:Microsoft 关联规则分析算法(7)

    前言 本篇继续我们的微软挖掘算法系列总结,前几篇我们分别介绍了:微软数据挖掘算法:Microsoft 决策树分析算法(1).微软数据挖掘算法:Microsoft 聚类分析算法(2).微软数据挖掘算法: ...

  10. 网络编程中 TCP 半开连接和TIME_WAIT 学习

    https://blog.csdn.net/chrisnotfound/article/details/80112736 上面的链接就是说明来 SO_KEEPALIVE 选项 为什么还需要 在应用层开 ...