动态规划 01

102 阅读1分钟

LeetCode221

原题链接

代码如下:

/**
 * 动态规划
 * 
 * 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;
    }
}