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

2D 행렬의 최대 합 사각형 | C++의 DP-27

<시간/>

이 자습서에서는 2D 행렬에서 최대 합 사각형을 찾는 프로그램에 대해 설명합니다.

이를 위해 매트릭스가 제공됩니다. 우리의 임무는 요소의 최대 합으로 부분행렬을 찾는 것입니다.

예시

#include<bits/stdc++.h>
using namespace std;
#define ROW 4
#define COL 5
//returning maximum sum recursively
int kadane(int* arr, int* start,
int* finish, int n) {
   int sum = 0, maxSum = INT_MIN, i;
   *finish = -1;
   int local_start = 0;
   for (i = 0; i < n; ++i) {
      sum += arr[i];
      if (sum < 0) {
         sum = 0;
         local_start = i + 1;
      }
      else if (sum > maxSum) {
         maxSum = sum;
         *start = local_start;
         *finish = i;
      }
   }
   if (*finish != -1)
      return maxSum;
   maxSum = arr[0];
   *start = *finish = 0;
   //finding the maximum element
   for (i = 1; i < n; i++) {
      if (arr[i] > maxSum){
         maxSum = arr[i];
         *start = *finish = i;
      }
   }
   return maxSum;
}
void findMaxSum(int M[][COL]) {
   int maxSum = INT_MIN, finalLeft, finalRight, finalTop, finalBottom;
   int left, right, i;
   int temp[ROW], sum, start, finish;
   for (left = 0; left < COL; ++left) {
      memset(temp, 0, sizeof(temp));
   for (right = left; right < COL; ++right) {
      for (i = 0; i < ROW; ++i)
         temp[i] += M[i][right];
         sum = kadane(temp, &start, &finish, ROW);
         if (sum > maxSum) {
            maxSum = sum;
            finalLeft = left;
            finalRight = right;
            finalTop = start;
            finalBottom = finish;
         }
      }
   }
   cout << "(Top, Left) (" << finalTop << ", " << finalLeft << ")" << endl;
   cout << "(Bottom, Right) (" << finalBottom << ", " << finalRight << ")" << endl;
   cout << "Max sum is: " << maxSum << endl;
}
int main() {
   int M[ROW][COL] = {
      {1, 2, -1, -4, -20},
      {-8, -3, 4, 2, 1},
      {3, 8, 10, 1, 3},
      {-4, -1, 1, 7, -6}
   };
   findMaxSum(M);
   return 0;
}

출력

(Top, Left) (1, 1)
(Bottom, Right) (3, 3)
Max sum is: 29