统计全为1的正方形子矩阵-二维dp

1277. 统计全为 1 的正方形子矩阵 - 力扣(LeetCode)

Solution

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;
}