代码如下:
/**
* 动态规划
*
* dp的值表示 在该位置上,以它为右下角,能形成的最大正方形边长
*
* 则状态方程是 dp(i, j) = min(dp(i-1, j), dp(i-1, j-1), dp(i, j-1)) + 1;
* 分别是该方块的 上面、 左上、 和左边 的方块dp值, +1 是因为加上自己本身
* 每访问一个方块,就更新一次最大边长值
*
* Code by java
*/
class Solution {
public int maximalSquare(char[][] matrix) {
int maxSide = 0;
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return maxSide;
}
int rows = matrix.length, columns = matrix[0].length;
int[][] dp = new int[rows][columns];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
if (matrix[i][j] == '1') { //如果是1,则以这个方块为右下角判断左上角能组成的最大正方形
if (i == 0 || j == 0) { //如果是在边界,则有且仅有一个方块,就是自己
dp[i][j] = 1; //所以这个位置标志为1
} else {
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; //分别是上边,左边和左上的方块dp值,+1表示加上自己
}
maxSide = Math.max(maxSide, dp[i][j]); //更新最大边长
}
}
}
int maxSquare = maxSide * maxSide; //求面积
return maxSquare;
}
}