杭电1506题。

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


 
 

猜你喜欢

转载自blog.csdn.net/u010200793/article/details/16119365