关闭

poj 2559 Largest Rectangle in a Histogram 求面积最大的矩形(单调栈)

标签: poj
1801人阅读 评论(0) 收藏 举报
分类:

Largest Rectangle in a Histogram

题目大意

给出一个数N代表有多少个矩形,然后下面有N个数代表每个矩形的高度,宽度均为1。最后求这N个矩形组成的最大面积!

解题思路

很容易想到的就是使用单调栈。维护一个从栈顶到栈低减小的栈!
每次遇到栈顶的元素大于要压入的元素就要,出栈然后和当前的最大面积取最大值,这样一直下去,最后栈中就剩下一个从栈顶到栈低减小的栈。最后变为的栈就像下面这个图一样!
这里写图片描述

AC代码

我看的poj的discuss里面不让用long long和lld,事实证明是错。我就是用这个过的!

#include<cstdio>
#include<stack>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const int MX = 100000 + 5;

int main()
{
    int N;
    int height;
    while(~scanf("%d",&N) &&N)
    {
        stack<PII>Q;
        LL ans = 0;
        for(int i=0;i<N;i++)
        {
            scanf("%d",&height);
            LL width = 0;
            while(!Q.empty() && Q.top().first>=height ){ //当栈顶元素大于当前元素
                LL tmpH = Q.top().first;
                LL tmpW = Q.top().second;
                Q.pop();width+=tmpW;//每次出栈的时候,就是计算以这个矩形的高度为最长高度的最大面积,
                //因为左边的比他小,所以只需要向右延伸就可以了
                //所以每次出栈的时候,就是出栈后的栈顶元素宽度+1
                ans = max(ans,tmpH*width);//如果大于当前的最大面积就更新
            }
            Q.push(make_pair((LL)height,(LL)width+1));
        }
        int tmp = 0;
        while(!Q.empty()){
            ans = max(ans,Q.top().first*(tmp+Q.top().second));//原理和上面一样
            tmp+=Q.top().second;Q.pop();
        }
        printf("%lld\n",ans);
    }
    return 0;
}
0
0
查看评论

POJ2559 最大矩形面积

给定从左到右多个矩形,已知这此矩形的宽度都为1,长度不完全相等。这些矩形相连排成一排,求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。 建立一个单调递增栈,所有元素各进栈和出栈一次即可。每个元素出栈的时候更新最大的矩形面积。 ...
  • alongela
  • alongela
  • 2012-11-27 16:58
  • 7618

单调栈(poj -- 2559)

给定从左到右多个矩形,已知这此矩形的宽度都为1,长度不完全相等。这些矩形相连排成一排,求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。 建立一个单调递增栈,所有元素各进栈和出栈一次即可。每个元素出栈的时候更新最大的矩形面积。...
  • qq1169091731
  • qq1169091731
  • 2016-07-23 20:54
  • 558

POJ2559 单调递增栈

题意大概讲述的是有许多宽度为1的矩形,问你最大面积的矩形是多少。 更具模型可以得知,要是有一个高度较小块进入后,无法给前面高度较高的块增加同一高度的面积。这时候就可以处理前面的高块,因为现在的块是较低的,已经没办法可以接到后面较高的。所以删去前面所有比当前块高的块,并且处理这些块可以得到的面积。最...
  • guaiguai12138
  • guaiguai12138
  • 2017-03-29 20:52
  • 120

直方图中最大矩形面积

原文地址:http://www.geeksforgeeks.org/largest-rectangle-under-histogram/ 注意:本文并为对原文完整翻译,而是结合原文并根据本人理解写出,因此部分内容为完整翻译,部分内容为个人理解所写。直方图中最大矩形面积一个直方图是由许多矩形组成,在...
  • Revivedsun
  • Revivedsun
  • 2016-09-03 00:49
  • 4275

求直方图中最大矩形面积(C语言实现)

一个直方图是由许多矩形组成,在给定的直方图中找出最大的矩形面积。同时,为了简化问题,假定所有矩形宽度都为1个单位。例如,下面的直方图中有6个矩形,高度分别是(6,7,8,4,5,3)。最大的矩形面积是18(如下图所示,最大矩形面积用红色方框标出) 下面给出的解决方法时间复杂度为O(...
  • serena_0916
  • serena_0916
  • 2016-12-07 20:20
  • 930

最大矩形面积

# usr/bin/env python # _*_ coding:utf-8 _*_ ''' 给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度...
  • C_Donald
  • C_Donald
  • 2017-08-29 21:09
  • 380

栈——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 ...
  • jingsuwen1
  • jingsuwen1
  • 2016-06-03 12:43
  • 420

51Nod Problem 1102 面积最大的矩形(DP)

51Nod Problem 1102 面积最大的矩形(DP)
  • queuelovestack
  • queuelovestack
  • 2016-08-26 11:30
  • 808

51nod 1102 面积最大的矩形【单调栈、预处理】

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102题意:分析:这题及得好像在哪做过QAQ,很快就水掉了, 刚开始想的是枚举每个ai,然后向两边 找大于等于ai的最大范围Li和Ri,更新答案ans=max(ans...
  • hjt_fathomless
  • hjt_fathomless
  • 2017-02-25 00:06
  • 241

柱状图求最大矩形面积

题目描述: 给一组非负的整数来表示一个柱状图,设计一个算法获得柱状图中最大矩形的面积。比如,输入如下数据:2,1,4,5,1,3,3 ,其中每个数表示一个柱状条的高度,柱状条的宽度为默认值1,则计算得最大矩形的面积为8,如下图所示。 思路很简单,以一个柱形为中心往两边扫描,若旁边的柱...
  • hanleijun
  • hanleijun
  • 2014-04-22 11:00
  • 1473
    个人资料
    • 访问:327683次
    • 积分:5196
    • 等级:
    • 排名:第6314名
    • 原创:218篇
    • 转载:12篇
    • 译文:1篇
    • 评论:29条
    最新评论