杭电1506题。

来源:互联网 发布:深入理解java虚拟机 编辑:程序博客网 时间:2024/04/30 00:35

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


原创粉丝点击