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 here
int 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;
}
}
1079

被折叠的 条评论
为什么被折叠?



