Problem: 1277. 统计全为 1 的正方形子矩阵
文章目录
思路
动态规划。
解题过程
dp[i]
表示为以该位置为右下角的正方形的个数,状态转移方程为某位置的左,左上和上方位置的dp表的数值的最小值 + 1。
复杂度
-
时间复杂度: O ( m ∗ n ) O(m*n) O(m∗n)
-
空间复杂度: O ( m ∗ n ) O(m*n) O(m∗n)
Code
cpp
class Solution {
public:
int countSquares(vector<vector<int>>& matrix) {
int ret = 0, m = matrix.size(), n = matrix[0].size();
vector<vector<int>> dp(m, vector<int>(n));
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (matrix[i][j] && i && j &&
matrix[i][j - 1] && matrix[i - 1][j])
dp[i][j] = min({
dp[i - 1][j - 1],
dp[i][j - 1],
dp[i -1][j]
}) + 1;
else if (matrix[i][j])
dp[i][j] = 1;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
ret += dp[i][j];
return ret;
}
};