动态规划
算法思路
-
看下图,如果一个以
(i, j)
为右下角,4 * 4
的正方形可以成立,那么以(i, j - 1), (i - 1, j - 1), (i - 1, j)
为右下角的,3 * 3
的三个正方形(红橙绿三个框)也必须成立。 -
这里的边长只是举个例子,至于以
(i, j)
为右下角的正方形边长可以有多长,取决于左上方的三个正方形的边长,然后加1
,这就是转移方程里dp[row][column] = Math.min(Math.min(dp[row][column - 1], dp[row - 1][column]), dp[row - 1][column - 1]) + 1
为什么加1
的来源。 -
在
dp
表的填表过程中,是从左往右,上到下逐个填的,也就是从左上角到右下角。所以用正方形的右下角,而不是左上角来讨论。
ini
public int maximalSquare(char[][] matrix) {
int rows = matrix.length;
int columns = matrix[0].length;
int[][] dp = new int[rows][columns];
int maxSide = 0;
for (int row = 0; row < rows; row++) {
for (int column = 0; column < columns; column++) {
if (matrix[row][column] == '1') {
if (row == 0 || column == 0) {
dp[row][column] = 1;
} else {
dp[row][column] = Math.min(Math.min(dp[row][column - 1], dp[row - 1][column]),
dp[row - 1][column - 1]) + 1;
}
}
maxSide = Math.max(maxSide, dp[row][column]);
}
}
return maxSide * maxSide;
}