-
문제 링크
-
사용 언어
C++
-
소스
#include <iostream> using namespace std; int N, M; int A[1001][1001]; int L[1001][1001]; int Max = 0; int main() { cin >> N >> M; for(int i = 1; i <= N; i++){ for(int j = 1; j <= M; j++){ cin >> A[i][j]; if(A[i][j] == 0){ L[i][j] = min(min(L[i-1][j], L[i][j-1]), L[i-1][j-1]) + 1; Max = max(Max, L[i][j]); } } } cout << Max; }
-
논리
\((i, j)\) 를 우측 하단 꼭지점으로 삼는 정사각형 중
가장 큰 정사각형의 한 변의 길이를 \(\mbox{L}(i, j)로 표현하자.\)
그러면
\[\mbox{L}(i, j) = \mbox{min}(\mbox{L}(i-1, j),\mbox{L}(i, j-1),\mbox{L}(i-1, j-1)) + 1\]이다.