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

来源:互联网 发布:淘宝限购在哪里设置 编辑:程序博客网 时间:2024/05/02 00:48

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
原创粉丝点击