cpp
复制代码
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
//dp(i,j)表示(i,j)以位置的元素为右下角的全1子矩形的最大边长
//状态转移方程:mat[i][j]==1时:dp(i,j)=min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1;
int countSquares(vector<vector<int>>& mat) {
int n = mat.size();
int m = mat[0].size();
int ans = 0;
vector<vector<int>>dp(n + 1, vector<int>(m + 1, 0));
// for (int i = 0; i < n; ++i) {
// dp[i][0] = mat[i][0];
// ans+=dp[i][0];
// }
// for (int j = 0; j < m; ++j) {
// dp[0][j] = mat[0][j];
// ans+=dp[0][j];
// }
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (i == 0 || j == 0) {
dp[i][j] = mat[i][j];
}
else if (mat[i][j]) {
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
}
ans += dp[i][j];
}
}
return ans;
}
};
int main() {
return 0;
}