您的位置:首页 > 其它

HDU - 1506 Largest Rectangle in a Histogram

2015-10-29 21:24 253 查看
题意:给你n个木板的长度,且宽度都为1,让你找出最大的矩形区域面积

思路:这道题的关键就是算出每个可能的矩形的面积,而面积的计算方法可以是从一个板开始找出可向左延伸和向右延伸的边界,若左边界为L右边界为R,那么矩阵大小公式就是H[i]*(R-L+1),此时我们需要找到每个板可延伸到的边界。此时用两个数组L[i],R[i]来表示第i个板的左右延伸边界。计算边界的方法为

for(i=1;i<=n;i++)

{

while(a[l[i]-1]>=a[i])

l[i]=l[l[i]-1];

}

for(i=n;i>=1;i--)

{

while(a[r[i]+1]>=a[i])

r[i]=r[r[i]+1];

}
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

long long l[110000],r[110000],a[110000];
int main()
{
int n,i;
while(scanf("%d",&n),n!=0)
{
a[0]=-1;
a[n+1]=-1;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
r[i]=i;
l[i]=i;
}
for(i=1;i<=n;i++)
{
while(a[l[i]-1]>=a[i])
l[i]=l[l[i]-1];
}
for(i=n;i>=1;i--)
{
while(a[r[i]+1]>=a[i])
r[i]=r[r[i]+1];
}
long long maxn=0,m;
for(i=1;i<=n;i++)
{
m=a[i]*(r[i]-l[i]+1);
if(m>maxn)
maxn=m;
}
printf("%lld\n",maxn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: