古典的な単調最大サブ矩形スタック - 牛オフより学校を第2のフィールドH

トピックは二番目に大きいサブ矩形を求めているとき、保守M1、M2ができ、その後、ほとんどのサブ矩形を行います

プロセスは、M2を転送するときにノートを取ることです

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define MAXN 1005
 チャーMP [MAXN] [MAXN]。
INTのN、M、F [MAXN] [MAXN]、M1、M2。

INT STK [MAXN]、トップ、[MAXN] W。
ボイド CALC(int型I){ 
    トップ = 0 
    F [i]は[M + 1 ] = 0 ; 
    memsetの(W、0はsizeof W)。
    INT J = 1 <; = M + J 1、J ++ 場合([I] [J] F> {STK [トップ])
            STK [トップ++] = F [I]、[J]、
            W [トップ] = 1 ; 
        }      
        そうでなければ{
             int型の幅= 0 ;
             一方、(F [I]、[J] < STK [トップ]){  + = W [トップ]; 
                
                IF(STK [トップ] *(幅)> = M1){ 
                    M2 = MAX(M1、STK [トップ] *(width- 1。 )); // * M1及び高さ(幅-1)と比較、より好ましくは大きい 
                    のM1 = STK [トップ] * (幅); 
                } 
                そう
                    M2 = MAX(M2、STK [トップ] * 幅); 
                    
                トップ- ; 
            } 
            STKの[ ++トップ]は[トップ] W F [I] [J] =幅+ = 1 
        } 
} 

int型のmain(){ 
    CIN >> N >> M。
    int型 iは= 1のscanf(; iが<= N I ++)は" %sの"、MP [I] + 1 )。
    以下のためにint型 i = 1 ; iが<= N; iは++ ){
         ためのint型 J = 1 ; J <= Mであり、j ++ 場合(MP [I] [J] == ' 1 '
                F [I] [J]= F [I- 1 ] [J] + 1 ;
            他の [I] [J] = F 0 ; 
    } 
    のためにint型 I = 1を iが++; iが<= N 
        CALC(I)。
    coutの << M2 << てendl; 
}

 

おすすめ

転載: www.cnblogs.com/zsben991126/p/11286257.html