# LeetCode 1277. Count Square Submatrices with All Ones https://leetcode.com/problems/count-square-submatrices-with-all-ones/description/ ## 題目大意 給定元素只有 `0` 或 `1` 的 $m\times n$ 矩陣,有多少**子方陣**內容全為 `1`? ## 思考 這題感覺就用 DP 來解 令 $\text{dp}[i][j]$ 表示以 $(i, j)$ 為右下角的所有子方陣數量,包括大小為 $1 \times 1, 2 \times 2, \cdots \text{dp}[i][j] \times \text{dp}[i][j]$ 的方陣 $$ \text{dp}[i][j] = \begin{cases} \text{matrix}[i][j] & \text{if } i = 0 \text{ or } j = 0 \\ \min(\text{dp}[i-1][j], \text{dp}[i][j-1], \text{dp}[i-1][j-1]) + 1 & \text{if } \text{matrix}[i][j] = 1 \\ 0 & \text{if } \text{matrix}[i][j] = 0 \end{cases} $$ 每次計算出 $\text{dp}[i][j]$ 後,我們將其累加到 `ans` 中,即為所求 C++ 參考解答: ```cpp! class Solution { public: int countSquares(vector<vector<int>> &matrix) { const int m = matrix.size(); const int n = matrix.begin()->size(); vector<vector<int>> dp(m, vector<int>(n)); int ans = 0; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (!(i && j)) dp[i][j] = matrix[i][j]; else if (matrix[i][j] == 1) dp[i][j] = min({dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]}) + 1; ans += dp[i][j]; } } return ans; } }; ``` Go 參考解答: ```go! func countSquares(matrix [][]int) int { m := len(matrix) n := len(matrix[0]) dp := make([][]int, m) for j := range dp { dp[j] = make([]int, n) } var ans int for i := 0; i < m; i++ { if matrix[i][0] == 1 { dp[i][0] = 1 } } for j := 0; j < n; j++ { if matrix[0][j] == 1 { dp[0][j] = 1 } } for i := 1; i < m; i++ { for j := 1; j < n; j++ { if matrix[i][j] == 1 { dp[i][j] = min(dp[i-1][j], dp[i-1][j-1], dp[i][j-1]) + 1 } } } for i := 0; i < m; i++ { for j := 0; j < n; j++ { ans += dp[i][j] } } return ans } func min(a, b, c int) int { if a < b && a < c { return a } if b < c { return b } return c } ```