FENCE 문제..

  • skan1543
    skan1543

    FENCE

    분할정복알고리즘으로..

    중앙을 기준으로 왼쪽부분, 오른쪽부분 사각형의 최대 넓이
    중앙에서 퍼져나가는 사각형의 최대넓이.. 이렇게 3가지를 비교해서 답을 구하는 방식으로 풀었습니다.

    알고리즘 문제 해결 전략의 답안 소스를 봐도 제 소스랑 다른바가 없던데.. 왜 오답이 나는지 잘 모르겠네요 ㅠㅠ

    #include<iostream>
    
    using namespace std;
    
    int length;
    int height[20001]={0,};
    
    int process(int x,int y)
    {
        int mid=(x+y)/2;
    
        if(y-x==1 || y==x) 
        {
            if(height[x]>height[y]) return height[y]*(y-x+1);
            return height[x]*(y-x+1);
        }
    
        int left=process(x,mid);
        int right=process(mid+1,y);
    
        int i,j;
        int min=30000; int max=height[mid];
    
        for(i=mid,j=mid;i>=x,j<=y;)
        {
            if(height[i-1] > height[j+1]) i--;
            else j++;
    
            if(min>height[i]) min=height[i];
            if(min>height[j]) min=height[j];
            if(max<min*(j-i+1)) max=min*(j-i+1);
    
    
        }
    
        if(left>right) right=left;
    
        if(right>max) return right;
        else return max;
    }
    
    int main( )
    {
        int T;
        for(cin >> T;T--;){
    
            cin >> length;
    
            for(int i=1;i<=length;i++) scanf("%d",&height[i]);
    
            cout << process(1,length) << endl;
    
        }
        return 0;   
    }
    

    10년 전
1개의 댓글이 있습니다.
  • Kureyo
    Kureyo

    j+1이 [0,20001)을 넘을것같네요


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.