436

来源:互联网 发布:搜狐快站绑定独立域名 编辑:程序博客网 时间:2024/06/05 12:03

2017.9.5

依旧是在学习动态规划。

给定一个点,如果它的值为1的话,

            在这种情况下正方形的边长可以加1    ————   它的上方,它的左方,它的左上角都必须为1;

            加入这个节点之后,最新形成的正方形的边长为  ———— 上方,左方,左上方的最小值 + 1;

否则, 这个节点的dp值为1。

public class Solution {    /**     * @param matrix: a matrix of 0 and 1     * @return: an integer     */    public int maxSquare(int[][] matrix) {        // write your code hereint n = matrix.length;if(n <= 1){return n;}int m = matrix[0].length;if(m <= 1){return m;}int [][]dp = new int[n][m];int max = 0;for(int i = 0; i < n; i++){if(matrix[i][0] == 1){dp[i][0] = 1;max = Math.max(max, 1);}}for(int j = 0; j < m; j++){if(matrix[0][j] == 1){dp[0][j] = 1;max = Math.max(max, 1);}}for(int i = 1; i < n; i++){for(int j = 1; j < m; j++){if(matrix[i][j] == 1){if(matrix[i-1][j] == 1 && matrix[i][j-1] == 1 && matrix[i-1][j-1] == 1){dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]);dp[i][j] = Math.min(dp[i][j], dp[i-1][j-1]) + 1;}else{dp[i][j] = 1;}max = Math.max(max, dp[i][j]);}}}return max * max;    }}