[동적 프로그래밍 85 극대 직사각형 leetcode

문제 : https://leetcode.com/problems/maximal-rectangle/

         나의 접근 방식은 하나의 차원에 넣어하는 것입니다. 먼저, 프리픽스 및 각 열을 구한다.

         행을 스캔 한 후, 각 행은 똑같은 히스토그램, 최대 사각형 영역의 히스토그램의 바로 다음 계산을 수득 횡축, 높이와 현재의 값으로 간주 될 수있다. O의 시간 복잡도 (N3)

클래스 해결 {
 공개 :
     INT maximalRectangle (벡터 <벡터 < 문자 >> 및 매트릭스) {
         경우 (matrix.size () == 0 ) 복귀  0 ;
        INT m = matrix.size ();
        INT n은 행렬 [ 0 ] 크기는 ();
        INT 최대 = 0 ; 
        벡터 <벡터 < INT >> DP (m, 벡터 < INT > (N, 0 ));
        위한 ( int로 I = 0 ; I <m은, 내가 ++ ) {
             ( INT의 J = 0 ; J <N; J ++ ) {
                 경우 (== 행렬 [I] [J] ' 1 ' ) {
                     경우 (Ⅰ> = 1 ) (DP)가 [I]는 [j]가 DP를 = I - 1 [J] + 1 ;
                    다른 DP [I] [J] = 1 ; 
                   
                } 
            } 
        } 
        에 대해 ( int로 I = 0 ; I은 m이 <; 내가 ++ ) {
             위해 ( INT의 J = 0 , N J <; J를 ++ ) {
                 만약(DP [I] [J]> 0 ) {
                     INT의 높이 = DP [I] [J]
                    위한 ( INT의 K = J, K> = 0 ; k-- ) {
                         경우 (DP [I] [K] == 0 ) 분해 ;
                        경우 (DP [I] [K] <높이) 높이 = DP [I] [K];
                        INT의 R = (j - K + 1 ) * 높이;
                        경우 (R> 최대) = 최대 R; 
                    } 
                } 
            } 
        } 
        반환최대; 
    } 
};

 

추천

출처www.cnblogs.com/fish1996/p/11299856.html