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; }