zstu 2107 Largest Rectangle in a Histogram

4877 단어 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가 저장한 것은 거리가 아니라 현재 점이 도달할 수 있는 가장 먼 위치(첫 번째로 도달할 수 없는 위치일 수도 있다)를 생각하면 된다.오랫동안 화를 내다.롱롱을 하려면 제목 안의 하이분에 얼굴을 때려야 한다.
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
"
,ans); } return 0; }

좋은 웹페이지 즐겨찾기