思想:把矩阵中的每个点作为正方形右下角点来处理,则以该点为右下角点的全为1的正方形的最大边长,最多比以它的左方、上方和左上方为右下角的全为1的正方形边长多1。用d[i][j]表示以i,j坐标为右下角的正方形最大边。则有状态转移方程:dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1。
做法:先根据原数组matrix初始化最优解数组dp第一行和第一列,接着从matrix[1,1]开始,挨个遍历,遇到matrix[i,j]==1时,dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1。然后更新res= Math.max(res, dp[i][j])。
public class Main{
public static int maxSquare(int[][] matrix) {
if (matrix.length==0||matrix[0].length==0) {
return 0;
}
int row = matrix.length;
int col = matrix[0].length;
int res = 0;//结果
int[][] dp = new int[row][col];
//初始化dp
for (int i=0; i<row; i++) {
if (matrix[i][0] == 1) {
dp[i][0] = 1;
res = 1;
}
}
for (i