1277. Count Square Submatrices with All Ones

问题:

给定由0,1构成的数组,求由1构成的(各种长度边长的)正方形的总个数有多少。

Example 1:

Input: matrix =
[
  [0,1,1,1],
  [1,1,1,1],
  [0,1,1,1]
]
Output: 15
Explanation: 
There are 10 squares of side 1.
There are 4 squares of side 2.
There is  1 square of side 3.
Total number of squares = 10 + 4 + 1 = 15.

Example 2:
Input: matrix = 
[
  [1,0,1],
  [1,1,0],
  [1,1,0]
]
Output: 7
Explanation: 
There are 6 squares of side 1.  
There is 1 square of side 2. 
Total number of squares = 6 + 1 = 7.
 
Constraints:
1 <= arr.length <= 300
1 <= arr[0].length <= 300
0 <= arr[i][j] <= 1

  

解法:

动态规划DP

dp[i][j]:代表,以matrix[i][j]为右下角的正方形的个数。

动态转移方程:

如果该节点matrix[i][j]==1:

dp[i][j]=min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) +1

如果该节点matrix[i][j]==0:

dp[i][j]=0=matrix[i][j]

代码参考:

 1 class Solution {
 2 public:
 3     int countSquares(vector<vector<int>>& matrix) {
 4         int m=matrix.size(), n=matrix[0].size();
 5         int res=0;
 6         for(int i=0; i<m; i++){
 7             for(int j=0; j<n; j++){
 8                 if(i>0 && j>0 && matrix[i][j]>0){
 9                     matrix[i][j] = min(matrix[i-1][j-1], min(matrix[i-1][j], matrix[i][j-1]))+1;
10                 }
11                 res+=matrix[i][j];
12             }
13         }
14         return res;
15     }
16 };
原文地址:https://www.cnblogs.com/habibah-chang/p/13209950.html