Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

범위 합계 쿼리 2D - C++에서 변경할 수 없음


행렬이라고 하는 2D 행렬이 있다고 가정하면 (row1, col1)을 사용하여 왼쪽 상단 모서리로 정의된 직사각형 내부 요소와 ( 행2, 열2).

따라서 행렬이 다음과 같은 경우 -

3 0 1 4 2
5 6 3 2 1
1 2 0 1 5
4 1 0 1 7
1 0 3 0 5

(2,1) 및 (4,3)으로 정의된 파란색의 위 사각형에는 합계 8이 포함됩니다.

따라서 sumRegion(2, 1, 4, 3), sumRegion(1, 1, 2, 2), sumRegion(1, 2, 2, 4)과 같은 쿼리를 수행하면 각각 8, 11, 12를 반환합니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • dp라는 행렬을 정의합니다.

  • 다음과 같이 작업을 초기화합니다.

  • n :=행 수. n이 0이면 반환,

  • m :=열 수

  • dp :=n x m 크기의 또 다른 행렬

  • 범위 0에서 n까지의 i에 대해

    • 0에서 m 사이의 j에 대해

      • j – 1 <0이면 dp[i, j]를 행렬[i, j]로 설정하고, 그렇지 않으면 (dp[i, j - 1] + matrix[i, j])

        로 설정합니다.
  • 범위 1에서 n까지의 i에 대해

    • 0에서 m 사이의 j에 대해

      • dp[i, j] dp[i – 1, j] 증가

  • 쿼리 메소드의 경우 row1, col1, row2, col2

    를 사용합니다.
  • ret :=dp[행2, 열2]

  • sub1 :=row1 – 1 <0일 때 0, 그렇지 않으면 dp[row1 – 1, col2]

  • sub2 :=col1 – 1 <0일 때 0, 그렇지 않으면 dp[row2, col1 - 1]

  • row1 – 1 <0 또는 col1 – 1 <0이면

    • 추가 :=0

  • 그렇지 않으면 추가 :=dp[row1 – 1, col1 – 1]

  • 리턴 ret – sub1 – sub2 + 추가

예시(C++)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class NumMatrix {
   public:
   vector < vector <int>> dp;
   NumMatrix(vector<vector<int>>& matrix) {
      int n = matrix.size();
      if(!n) return;
      int m = matrix[0].size();
      dp = vector < vector <int>>(n, vector <int> (m));
      for(int i = 0; i < n; i++){
         for(int j = 0 ;j < m; j++){
            dp[i][j] = j - 1 < 0 ? matrix[i][j] : dp[i][j - 1] + matrix[i][j];
         }
      }
      for(int i = 1; i < n; i++){
         for(int j = 0; j < m; j++){
            dp[i][j] += dp[i - 1][j];
         }
      }
   }
   int sumRegion(int row1, int col1, int row2, int col2) {
      int ret = dp[row2][col2];
      int sub1 = row1 - 1 < 0 ? 0 : dp[row1 - 1][col2];
      int sub2 = col1 - 1 < 0 ? 0 : dp[row2][col1 - 1];
      int add = row1 - 1 < 0 || col1 - 1 < 0 ? 0 : dp[row1 - 1][col1 - 1];
      return ret - sub1 - sub2 + add;
   }
};
main(){
   vector<vector<int>> mat = {{3,0,1,4,2},{5,6,3,2,1},{1,2,0,1,5},{4,1,0,1,7},{1,0,3,0,5}};
   NumMatrix ob(mat);
   cout << ob.sumRegion(2,1,4,3) << endl;
   cout << ob.sumRegion(1,1,2,2) << endl;
   cout << ob.sumRegion(1,2,2,4) << endl;
}

입력

[[3,0,1,4,2],
[5,6,3,2,1],
[1,2,0,1,5],
[4,1,0,1,7],
[1,0,3,0,5]]
sumRegion(2,1,4,3)
sumRegion(1,1,2,2)
sumRegion(1,2,2,4)

출력

8
11
12