标签:
Input
Output
Sample Input
7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0
Sample Output
8 4000
题意:从左到右有N个高度不同但底边边长为1的矩形,问从中能够裁出的最大面积的矩形的面积是多少。而且矩行的边必须与纵轴、横轴平行。
解析:设置两个数组le[],ri[],分别表示以某个小矩形为起点,向左、向右能延伸的最远位置(比该小矩形的高度小的)用单调栈维护,我写的le[],ri[]是第一个不符合条件的位置,所以面积=h[i]*(ri[i]-le[i]-1);
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
typedef __int64 LL;
LL H[100005],le[100005],ri[100005],que[100005]; //高度,左边界,右边界,单调栈
int main()
{
int N;
while(cin>>N)
{
if(!N) break;
for(int i=1;i<=N;i++) scanf("%I64d",&H[i]);
int rear=0;
for(int st=1;st<=N;st++) //从左往右扫,找le[]
{
while(rear>0&&H[que[rear]]>=H[st]) --rear; //更新
if(rear==0) le[st]=0; //如果栈空的话,边界设为0
else le[st]=que[rear];
que[++rear]=st; //入栈
}
rear=0;
for(int st=N;st>=1;st--) //从右往左扫
{
while(rear>0&&H[que[rear]]>=H[st]) --rear;
if(rear==0) ri[st]=N+1;
else ri[st]=que[rear];
que[++rear]=st;
}
LL ans=0;
for(int i=1;i<=N;i++) if(ans<H[i]*(ri[i]-le[i]-1)) ans=H[i]*(ri[i]-le[i]-1); // 答案
cout<<ans<<endl;
}
return 0;
}
hdu 1506 Largest Rectangle in a Histogram(单调栈)
标签:
原文地址:http://www.cnblogs.com/wust-ouyangli/p/4766353.html