动态规划
当前正方形的边长由其左方、左上方、上方的正方形边长决定!!
class Solution {
public int maximalSquare(char[][] matrix) {
//动态规划 dp[i][j]表示以m[i][j]为右下角的正方形的边长
int row = matrix.length, col = matrix[0].length;
int[][] dp = new int[row][col];
int maxSide = 0;//记录最大边长
for(int i = 0;i < row;i++){
for(int j = 0;j < col;j++){
if(matrix[i][j] == '1'){
if(i == 0 || j == 0){
dp[i][j] = 1;
}
else{//dp(i,j) 的值由其上方、左方和左上方的三个相邻位置的 dp 值决定!!!
dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i-1][j-1]), dp[i][j-1])+1;
}
}
maxSide = Math.max(maxSide, dp[i][j]);
}
}
return maxSide*maxSide;
//动态规划 dp[i][j]表示以m[i][j]为右下角的正方形的面积
// int row = matrix.length, col = matrix[0].length;
// int[][] dp = new int[row][col];
// int area = 0;
// for(int i = 0;i < row;i++){
// dp[i][0] = matrix[i][0] == '1' ? 1 : 0;
// area = Math.max(area, dp[i][0]);
// }
// for(int j = 0;j < col;j++){
// dp[0][j] = matrix[0][j] == '1' ? 1 : 0;
// area = Math.max(area, dp[0][j]);
// }
// for(int i = 1;i < row;i++){
// for(int j = 1;j < col;j++){
// if(matrix[i][j] == '0'){
// dp[i][j] = 0;
// }
// else{
// int n = (int)Math.sqrt((double)dp[i-1][j-1]);//开方
// int k = 1;
// for(;k < n+1;k++){
// if(matrix[i-k][j] == '0' || matrix[i][j-k] == '0'){
// break;
// }
// }
// if(dp[i][j] != 1)//未赋值
// dp[i][j] = k*k;
// }
// area = Math.max(area, dp[i][j]);
// }
// }
// return area;
}
}