hdoj - 1506 直方图中最大的矩形

Problem Description

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles:

Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.

Input

The input contains several test cases. Each test case describes a histogram and starts with an integer n, denoting the number of rectangles it is composed of. You may assume that 1 <= n <= 100000. Then follow n integers h1, ..., hn, where 0 <= hi <= 1000000000. These numbers denote the heights of the rectangles of the histogram in left-to-right order. The width of each rectangle is 1. A zero follows the input for the last test case.

Output

For each test case output on a single line the area of the largest rectangle in the specified histogram. Remember that this rectangle must be aligned at the common base line.

Sample Input

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

Sample Output

8 4000

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int a[100005];
int l[100005],r[100005];
int main()
{
    int n;

    while(scanf("%d",&n) && n != 0)
    {
        long long ans=0;
        memset(a,0,sizeof(a));
        for(int i = 0;i<n;i++)
        {
            scanf("%d",&a[i]);
            l[i] = r[i] = i;
            while(l[i] > 0 && a[l[i]-1] >= a[i])
            {
                l[i] = l[l[i]-1];
            }
        }
        for(int i = n-1;i>=0;i--)
        {
            while(r[i]<n-1 && a[r[i]+1] >= a[i])
            {
                r[i] = r[r[i]+1];
            }
        }
        for(int i = 0;i<n;i++)
        {
            long long  s = (long long)a[i]*(r[i]-l[i]+1);
            if(s>ans)
            {
                ans = s;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

Largest Rectangle in a Histogram【暑期培训Q题】【DP】【递归】

原文地址:https://www.cnblogs.com/hdyss/p/10853303.html

时间: 2024-09-30 23:59:40

hdoj - 1506 直方图中最大的矩形的相关文章

[LeetCode] Largest Rectangle in Histogram 直方图中最大的矩形

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The largest

AcWing:131. 直方图中最大的矩形(贪心 + 单调栈)

直方图是由在公共基线处对齐的一系列矩形组成的多边形. 矩形具有相等的宽度,但可以具有不同的高度. 例如,图例左侧显示了由高度为2,1,4,5,1,3,3的矩形组成的直方图,矩形的宽度都为1: 通常,直方图用于表示离散分布,例如,文本中字符的频率. 现在,请你计算在公共基线处对齐的直方图中最大矩形的面积. 图例右图显示了所描绘直方图的最大对齐矩形. 输入格式 输入包含几个测试用例. 每个测试用例占据一行,用以描述一个直方图,并以整数n开始,表示组成直方图的矩形数目. 然后跟随n个整数h1,…,hn

AcWing - 131 - 直方图中最大的矩形 = 单调栈

https://www.acwing.com/problem/content/133/ 单调栈的模板题,按道理悬线dp不用的话也可以这样做. 需要注意这道题不能直接dp,比如[3,5,4],这组数据,3可以拓展5,但5不能拓展4,不过3可以拓展4. #include<bits/stdc++.h> using namespace std; typedef long long ll; int n; ll a[100005]; int l[100005]; int r[100005]; stack&

计算直方图中最大矩形面积

题目是计算直方图中的最大矩形面积,下面是我的做法,我在网上也看到有人说可以通过栈的方式来解决,因为时间问题,并没有马上尝试,下回有时间在尝试下吧!! 还有这题有变式:计算矩阵中最大的矩形面积,其中矩阵中元素只能为1和0,代码下次补发吧!! 代码如下: #include<iostream>using namespace std; int maxSquare(const int pos,const int n,const int height[]){ if(n==1) return height[

直方图中最大矩形面积

注意:本文并未对原文完整翻译,而是结合原文并根据本人理解写出,因此部分内容为完整翻译,部分内容为个人理解所写. Largest Rectangle in Histogram 直方图中最大矩形面积 一个直方图是由许多矩形组成,在给定的直方图中找出最大的矩形面积.为了简化问题,假定所有矩形宽度都为1个单位. 例如,下面的直方图中有7个矩形,高度分别是(6,2,5,4,5,2,6).最大的矩形面积是12(如下图所示,最大矩形面积用红色方框标出) 下面给出的解决方法时间复杂度为O(n).矩形面积的计算公

【算法】直方图中最大面积问题

问题描述 给定一个直方图,求这个直方图中最大矩阵对应的面积是多少? 比如有个图如下 (对应的数组为:[2,1,5,6,2,3]) 那么对应的最大矩形的面积应该为 10: 问题分析 这类题是很常见的一道题,也是面试当中很容易考到的一题.解决方法倒是挺多.常见的比如Divide-and-conqure等方法,复杂度也都是O(n log n). 现在有没有一种更快的方法呢?复杂度可以达到 O(n) 问题求解 解法1:分治法(divide-and-conqure) 分治法,正如其名,需要对该问题分而治之

寻找直方图中面积最大的矩形

Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectang

Leetcode 84 求直方图中矩形的最大面积

题目描述 Leetcode 84 给定 n 个正整数的列表,表示矩形的高度,表示直方图.每一个给出的矩形宽度是 1,找到在直方图里最大的矩形面积. 如图中给出的直方图,宽度是 1,给出的高度是 [2,1,5,6,2,3]. 可以在直方图中找出最大的隐藏面积,答案是 10. Input: [2,1,5,6,2,3] Output: 10 题目分析 解法一: 最后矩形的最大面积,肯定是以某个矩形为最矮高度,向左向右可扩展的最大面积. 举例子来说,假设以 6 为当前直方图中的最矮高度,分别向左和向右扩

hdoj 1506&amp;amp;&amp;amp;1505(City Game) dp

// l表示从l[i]到i连续大于a[i]的最远左区间.r表示从i到r[i]连续大于a[i]的最远又区间 DP 找出 a[i] 的最远左区间和最远右区间与自己连着的比自己大的数的长度 , 然后用这个长度乘以 a[i], 乘积最大的那个就是答案 hdoj 1506 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 100000+10 #define