トピックは二番目に大きいサブ矩形を求めているとき、保守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; }