• 문제 링크

    https://www.acmicpc.net/problem/14925

  • 사용 언어

    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\]

    이다.