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

C++ 프로그램의 n 배열에서 증가하는 순서 요소의 최대 합

<시간/>

이 문제에서는 크기가 nXm인 2차원 행렬이 제공됩니다. 우리의 임무는 n개의 배열에서 증가하는 차수의 최대 합을 찾는 프로그램을 만드는 것입니다.

프로그램 설명 − 여기서 i번째 행의 요소가 (i+1)번째 행의 요소보다 작도록 각 행에서 하나의 요소를 취하여 요소의 최대 합을 찾아야 합니다. 등등. 그러한 합계가 가능하지 않으면 결과가 불가능함을 나타내는 −1을 반환합니다.

문제를 이해하기 위해 예를 들어보겠습니다.

입력

mat[][] = {
   {4, 5, 1, 3, 6},
   {5, 9, 2, 7, 12},
   {13, 1, 3, 6, 8},
   {10, 5, 7, 2, 4}
}

출력

31

설명

Taking elements from the matrix to create max Sum:
6 + 7 + 8 + 10 = 31,
6 From array 1, the maximum value.
7 from array 2, choosing 12(maximum value) cannot provide a solution.
8 from array 3, choosing 13(maximum value) cannot provide a solution.
10 From array 4, the maximum value

솔루션 접근 방식

문제에 대한 해결책은 배열 배열의 마지막 배열에서 요소를 선택한 다음 주어진 요소보다 작은 가능한 가장 큰 요소를 선택하는 것입니다.

이제 이 솔루션을 사용하여 i+1번째 배열(행)에 있는 요소보다 작은 itharray(행)에 요소가 없는 경우가 하나 있습니다. 여기에서 -1을 반환합니다.

배열을 정렬하면 솔루션의 효율성에 큰 도움이 될 수 있습니다. 오름차순으로 정렬하는 것처럼 가장 큰 요소는 인덱스 m−1에 있고 다음 요소는 더 작습니다. 따라서 조건을 만족하는 가장 큰 요소를 찾는 것은 쉽습니다.

알고리즘

maxSum =0, currMax 초기화

1단계 -

Sort each array of the array of arrays (each will have elements in
increasing order).

2단계 -

currMax = mat[n−1][m−1], the last element or the last row. Update
maxSum, maxSum = currMax.

3단계 -

행렬 rowise를 통해 루프, i =n−2에서 0.

3.1단계 -

Find the max element in mat[i][] which is smaller than
currMax at index j.

3.2단계 -

if j < 0, i.e. no value found. Return −1.

3.3단계 -

Update currMax. currMax = mat[i][j].

3.4단계 -

Update maxSum, maxSum = currMax.

4단계 -

Return maxSum.

예시

우리 솔루션의 작동을 설명하는 프로그램

#include <bits/stdc++.h>
#define M 5
using namespace std;
int calcMaxSumMat(int mat[][M], int n) {
   for (int i = 0; i < n; i++)
   sort(mat[i], mat[i] + M);
   int maxSum = mat[n − 1][M − 1];
   int currMax = mat[n − 1][M − 1];
   int j;
   for (int i = n − 2; i >= 0; i−−) {
      for (j = M − 1; j >= 0; j−−) {
         if (mat[i][j] < currMax) {
            currMax = mat[i][j];
            maxSum += currMax;
            break;
         }
      }
      if (j == −1)
      return 0;
   }
   return maxSum;
}
int main() {
   int mat[][M] = {
      {4, 5, 1, 3, 6},
      {5, 9, 2, 7, 12},
      {12, 1, 3, 6, 8},
      {10, 5, 7, 2, 4}
   };
   int n = sizeof(mat) / sizeof(mat[0]);
   cout<<"The maximum sum of increasing order elements from n arrays is "<<calcMaxSumMat(mat, n);
   return 0;
}

출력

The maximum sum of increasing order elements from n arrays is 31