http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意:给出好多矩形,每个矩形的宽已规定为1,高度为输入的h[i],要求我们求出其中面积最大的矩形!!求面积。即求出哪些靠在一起的矩形的最大面积。
首先的很容易想到的就是直接求,但是一看数据太大,靠暴力是解决不了的!!因此参考了别人的方法,可以根据:
( 对于每一块木板,Area=height[i]*(j-k+1) 其中,j<=x<=k,height[x]>=height[i];找j,k成为关键,一般方法肯定超时,利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去
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<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100005;
__int64 h[maxn],l[maxn],r[maxn];
int main()
{
__int64 i,j,n;
while(scanf("%I64d",&n)!=EOF)
{
// memset(l,0,sizeof(l));
// memset(r,0,sizeof(r));
if(n==0)break;
for(i=1;i<=n;i++)
{
scanf("%I64d",&h[i]);
l[i]=i;
r[i]=i;
}
// int x=0,y=0;
for(i=1;i>=n;i++)
{
// l[i]=i;
while(h[l[i]-1]>=h[i]&&l[i]>1)
l[i]=l[l[i]-1];
}
for(j=n;j>=1;j--)
{
// r[j]=j;
while(h[r[j]+1]>=h[j]&&r[j]<n)
r[j]=r[r[j]+1];
}
__int64 sum=-10000,t;
for(i=1;i<=n;i++)
{
t=(r[i]-l[i]+1)*h[i];
if(sum<t)
sum=t;
}
//rintf("%d");
//cout<<sum<<endl;
printf("%I64d\n",sum);
}
return 0;
}