博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2559 HDU1506 ZOJ1985 Largest Rectangle in a Histogram【堆栈】
阅读量:6155 次
发布时间:2019-06-21

本文共 1503 字,大约阅读时间需要 5 分钟。

问题链接:

问题描述:参见上述链接。

问题分析:解决这个问题,一种是用暴力法(枚举法)来解决,任何一个矩形必然始于第i个直方图,终止于第j块直方图(i<=j),从所有这些面积中找出最大矩形面积即可;另外一种办法是对这n个数只看一遍,就算出最大矩形面积,其计算复杂度为O(n),相比较而言,要复杂一些,需要付出一些空间的代价。

程序说明:本程序采用后一种方法实现。基本思想是先找到一个逐步递增的面积,即如果Hi<Hi+1则最大面积是逐步递增的。这个过程中,将这些Hi放入堆栈中,直到不满足Hi<Hi+1为止。这个时候,最大的面积可能是最右边是Hi,由若干块(也可能只有1块)拼成的,从中获得一个最大的面积。出现面积非递增时,则把堆栈中比当前高的直方图弹出,重复上述过程,需要说明的是这不影响高的直方图与其右边连成一片。还有一点就是,所有的直方图的高度Hi>=1,这是一个前提,如果有的直方图高度为0,则这个算法需要另外设计。

参见:

AC的程序如下:

/* POJ2559 HDU1506 ZOJ1985 Largest Rectangle in a Histogram */#include 
#include
#include
using namespace std;const int MAXN = 100000;long long h[MAXN+1];int main(){ int n, temp; long long ans, area; while(scanf("%d", &n) != EOF && n) { // 输入数据 for(int i=0; i
s; for(int i=0; i<=n; i++) { if (s.empty() || h[s.top()] < h[i]) s.push(i); else { temp = s.top(); s.pop(); //弹出 area = h[temp] * (s.empty() ? i : i - s.top() - 1); if (area > ans) ans = area; --i; } } // 输出结果 printf("%lld\n", ans); } return 0;}
TLE的程序如下:

/* POJ2559 HDU1506 ZOJ1985 Largest Rectangle in a Histogram */#include 
#include
using namespace std;const int MAXN = 100000;long long h[MAXN];int main(){ int n; long long ans, height, area; while(scanf("%d", &n) != EOF && n) { // 输入数据 for(int i=0; i
ans) ans = area; } } // 输出结果 printf("%lld\n", ans); } return 0;}

转载于:https://www.cnblogs.com/tigerisland/p/7564057.html

你可能感兴趣的文章
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>
eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>
字符串去分割符号
查看>>
WPF中,多key值绑定问题,一个key绑定一个界面上的对象
查看>>
UML类图简明教程
查看>>
java反编译工具(Java Decompiler)
查看>>