hdu1506(单调栈)

Largest Rectangle in a Histogram

题意:

  给出n个连续的矩形,矩形的宽都为1,所有矩形放在同一水平线上(连续),问这些矩形组成的图形中可以找到的最大矩形面积是多少?

分析:

  首先根据题意,这个矩形的高一定是这n个矩形中某一个的高,所以我们就枚举将这n个矩形的高当成我们最后找到的最大矩形的高,求出在这n个高下对应的最大面积,取最大值就好了。

  对于怎么找到在某个高下,矩形向左向右的边界,则利用单调栈实现。

代码:

#include <bits/stdc++.h>

using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))

const int maxn=1e5+100;

int n;

stack<int>st;
ll h[maxn],L[maxn],R[maxn];

int main()
{
//    freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=1;i<=n;i++){
            scanf("%lld",&h[i]);
        }

        while(!st.empty())  st.pop();
        for(int i=1;i<=n;i++){
            while(st.size()&&h[st.top()]>=h[i]) st.pop();

            if(st.empty())  L[i]=0;
            else            L[i]=st.top();

            st.push(i);
        }
        while(!st.empty())  st.pop();
        for(int i=n;i>=1;i--){
            while(st.size()&&h[st.top()]>=h[i]) st.pop();

            if(st.empty())  R[i]=n+1;
            else            R[i]=st.top();

            st.push(i);
        }

        ll ans=0;
        for(int i=1;i<=n;i++){
            ans=max(ans,h[i]*(R[i]-L[i]-1));
        }
        printf("%lld\n",ans);
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/shutdown113/p/9377724.html