동적 기획 학습 - Leetcode - 1277 문제 - 통 계 는 모두 1 의 정사각형 자 사각형 개수

m * n 의 행렬 을 드 리 겠 습 니 다. 행렬 의 요 소 는 0 이 아니면 1 입 니 다. 그 중에서 완전히 1 로 구 성 된 정사각형 서브 행렬 의 개 수 를 통계 하고 되 돌려 주 십시오.
예시 1:
입력: matrix = [0, 1, 1], [1, 1, 1], [0, 1, 1, 1] 출력: 15 해석: 변 길이 가 1 인 정사각형 은 10 개 입 니 다.변 길이 가 2 인 정사각형 은 4 개다.변 길이 가 3 인 정사각형 은 하나 다.정사각형 의 총수 = 10 + 4 + 1 = 15.
출처: 스냅 백 (LeetCode) 링크:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones 저작권 은 인터넷 에 귀속 된다.상업 전 재 는 공식 권한 수여 에 연락 하 십시오. 비 상업 전 재 는 출처 를 밝 혀 주 십시오. * *
문제 풀이 사고 dp [i] [j] 는 자신 을 정사각형 으로 저장 한 다음 에 주위 의 세 개의 dp [i - 1] [j] dp [i] [j - 1] dp [i - 1] [j - 1] 의 개 수 를 보고 가장 작은 개 수 를 취한 다. 왜냐하면 하나의 정사각형 을 구성 하려 면 0 이 있 는 지, 최소 0 이 아 닌 지 를 봐 야 하기 때문에 2 단계 정사각형 을 구성 해 야 한다.유추 가 최소 1 이 아니라면 3 단 계 를 구성 할 수 있다.
class Solution {
public:
    int countSquares(vector<vector<int>>& matrix) {
    int row=matrix.size();//  
    int col=matrix[0].size();//  
    int ans=0;
    vector<vector<int>>dp(row+1,vector<int>(col+1,0));
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            if(i==0||j==0)dp[i][j]=matrix[i][j];//      
            if(matrix[i][j]==1)
            {
                dp[i+1][j+1]=min(min(dp[i+1][j],dp[i][j+1]),dp[i][j])+1;
                //           dp  +1 (        );
                ans+=dp[i+1][j+1];
            }
        }
    }
    return ans;
}
};

좋은 웹페이지 즐겨찾기