제목 설명:
0과 1로 채워진 mxn 이진 행렬이 주어지면 1 만 포함 된 가장 큰 정사각형을 찾아 그 면적을 반환합니다.
예 1 :
입력 : 행렬 = [[ "1", "0", "1", "0", "0"], [ "1", "0", "1", "1", "1"], [ "1", "1", "1", "1", "1"], [ "1", "0", "0", "1", "0"]]
출력 : 4
예 2 :
입력 : 행렬 = [[ "0", "1"], [ "1", "0"]]
출력 : 1
예 3 :
입력 : 행렬 = [[ "0"]]
출력 : 0
제약 :
m == matrix.length
n == matrix [i] .length
1 <= m, n <= 300
matrix [i] [j]는 '0'또는 '1'입니다.
시간 복잡도 : O (nm)
동적 프로그래밍 :
상태 표현 : dp [i] [j]는 (i, j)가 오른쪽 하단 모서리 인 가장 큰 정사각형의 측면 길이를 나타냅니다.
상태 전환 :
(i, j)가 가장 큰 값 오른쪽 아래 모서리 정사각형의 변 길이는 인접한 위쪽 변 (i-1, j), 왼쪽 (i, j-1), 왼쪽 위쪽 (i-1, j-1)에 따라 달라집니다. 이 세 점의 가장 큰 제곱은 세 점의 최소값 +1
class Solution {
public int maximalSquare(char[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int[][] dp = new int[m+1][n+1];
int res = 0;
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(matrix[i-1][j-1] == '1'){
dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
res = Math.max(res, dp[i][j]);
}
}
}
return res*res;
}
}