方法:动态规划
①确定状态:dp[i][j]表示以(i,j)为右下角的正方形最大边长;
②转移方程:
③初始条件和边界情况:i = 0,j = 0;
④计算顺序:因为dp[i][j]由dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] 推出,所以从小到大遍历。
class Solution {
public int countSquares(int[][] matrix) {
int ans = 0;
int rows = matrix.length;
int cols = matrix[0].length;
int[][] dp = new int[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (i == 0 || j == 0) {
dp[i][j] = matrix[i][j];
} else if (matrix[i][j] == 0) {
dp[i][j] = 0;
} else {
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
}
ans += dp[i][j];
}
}
return ans;
}
}