Count Square Submatrices with All Ones

medium dp matrix

Problem

Given a 0/1 matrix, count how many square submatrices contain only 1s. dp[i][j] equals the side length of the largest such square whose bottom-right corner is (i,j); summing all dp values gives the total count.

Inputmatrix = [[0,1,1,1],[1,1,1,1],[0,1,1,1]]
Output15
10 squares of side 1, 4 of side 2, and 1 of side 3.

def count_squares(matrix):
    m, n = len(matrix), len(matrix[0])
    dp = [[0] * n for _ in range(m)]
    total = 0
    for i in range(m):
        for j in range(n):
            if matrix[i][j] == 1:
                if i == 0 or j == 0:
                    dp[i][j] = 1
                else:
                    dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1])
                total += dp[i][j]
    return total
function countSquares(matrix) {
  const m = matrix.length, n = matrix[0].length;
  const dp = Array.from({ length: m }, () => new Array(n).fill(0));
  let total = 0;
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (matrix[i][j] === 1) {
        dp[i][j] = (i === 0 || j === 0)
          ? 1
          : 1 + Math.min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);
        total += dp[i][j];
      }
    }
  }
  return total;
}
class Solution {
    public int countSquares(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        int[][] dp = new int[m][n];
        int total = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 1) {
                    if (i == 0 || j == 0) dp[i][j] = 1;
                    else dp[i][j] = 1 + Math.min(dp[i-1][j-1],
                                       Math.min(dp[i-1][j], dp[i][j-1]));
                    total += dp[i][j];
                }
            }
        }
        return total;
    }
}
int countSquares(vector<vector<int>>& matrix) {
    int m = matrix.size(), n = matrix[0].size();
    vector<vector<int>> dp(m, vector<int>(n, 0));
    int total = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] == 1) {
                if (i == 0 || j == 0) dp[i][j] = 1;
                else dp[i][j] = 1 + min({ dp[i-1][j-1], dp[i-1][j], dp[i][j-1] });
                total += dp[i][j];
            }
        }
    }
    return total;
}
Time: O(m·n) Space: O(m·n)