zstu 2107 Largest Rectangle in a Histogram

一开始想到的。。不是dp 果断超时。。

 for(int i=2;i<=n;i++)
 {
     if(height[i-1]<height[i])
         node[i].left=0;
     else
     {
         int k=i-1;
         while(height[k]>=height[i]&&k>1)
         {
             k--;
         }
         node[i].left=i-k;
     }             
}

然后想到dp保存的不是距离,而是当前点可以到达的最远位置(也可以是第一个不可以到达的位置)
然后就可以了。。
wa了好久。。
要long long,题目里面的hi分分钟打脸。。

int height[100010]; 
for(int i=1;i<=n;i++) 
{ 
    scanf("%d",&height[i]); 
} 
for(int i=1;i<=n;i++) 
{ 
    long long test=(fabs(node[i].right-node[i].left)+1)*height[i]; //一直在纠结为何加了abs才让过。。
    ans=max(ans,test); 
} 

至于为何我这里要fabs。。碰巧而已。。
纠结了这个点一下午。。
原来输入也要lld 。。上面abs虽然过了,但是,是错误的。。
下面是真*正确版

#include<stdio.h>
#include<math.h>
long long max(long long g,long long h)
{
    return g>h?g:h;
}
struct nodes
{
    int left;
    int right;
}node[100010];
long long height[100010];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&height[i]);
            node[i].left=i;
            node[i].right=i;
        }
        height[0]=-1;
        height[n+1]=-1;
        for(int i=1;i<=n;i++)
        {
            while(height[i]<=height[node[i].left-1])
            {
                node[i].left=node[node[i].left-1].left;
            }
        }
        for(int i=n;i>=1;i--)
        {
            while(height[i]<=height[node[i].right+1])
            {
                node[i].right=node[node[i].right+1].right;
            }
        }
        long long ans=0;
        for(int i=1;i<=n;i++)
        {
            long long test=(node[i].right-node[i].left+1)*height[i];
            ans=max(ans,test);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

你可能感兴趣的:(dp)