C ++
 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

  1. C++の三角形の最大パス合計

    この問題では、三角形の形の数字が与えられます。私たちのタスクは、三角形の最大パス合計を見つけるプログラムを作成することです。 要素は、最初の行から1つの要素で始まり、次の行で要素の数を増やして、n番目の行に要素が入るまで配置されます。 したがって、プログラムは、三角形の要素の最大合計を提供するパスを見つけます。したがって、最大の合計を提供するパスを見つける必要があります。 問題を理解するために例を見てみましょう- 入力 −   1  5 6 8 2 9 出力 − 16 説明 − 上からのパスは最大合計を返します− 9 + 6 + 1 =16 この問題を

  2. C ++を使用して、マトリックス内の合計が最大の列を検索します。

    サイズがMxNの行列があるとします。合計が最大の列を見つける必要があります。このプログラムでは、トリッキーなアプローチには従わず、配列を列ごとにトラバースし、各列の合計を取得します。合計が最大の場合は、合計と列インデックスを出力します。 例 #include<iostream> #define M 5 #define N 5 using namespace std; int colSum(int colIndex, int mat[M][N]){    int sum = 0;    for(int i = 0; i<M; i++){