Maximum sum of increasing order elements from n arrays

Given n arrays of size m eacg. Find maximum sum obtained by selecting a number from each array such that the elements selected from i-th array is more than the element selected from (i-1)-th array. If maximum sum can not be obtained then return 0.

Examples:

Input : arr[][] = {{1, 7, 3, 4},
                   {4, 2, 5, 1},
                   {9, 5, 1, 8}}
Output : 18
Explanation :
We can select 4 from first array, 5 from 
second array and 9 from third array.

Input : arr[][] = {{9, 8, 7},
                   {6, 5, 4},
                   {3, 2, 1}}
Output : 0



The idea is to start picking from last array. We pick the maximum element from last array, then we move to second last array. In second last array, we find the largest element which is smaller than the maximum element picked from last array. We repeat this process till we reach first array.

To obtain maximum sum we can sort all arrays and start bottom to up traversing each array from right to left and choose a number such that it is greater then previous element. If we are not able to select an element from array then return 0.

// CPP program to find maximum sum
// by selecting a element from n arrays
#include <bits/stdc++.h>
#define M 4
using namespace std;

// To calculate maximum sum by
// selecting element from each array
int maximumSum(int a[][M], int n) {

  // Sort each array
  for (int i = 0; i < n; i++)
    sort(a[i], a[i] + M);

  // Store maximum element
  // of last array
  int sum = a[n - 1][M - 1];
  int prev = a[n - 1][M - 1];
  int i, j;

  // Selecting maximum element from
  // previoulsy selected element
  for (i = n - 2; i >= 0; i--) {
    for (j = M - 1; j >= 0; j--) {
      if (a[i][j] < prev) {
        prev = a[i][j];
        sum += prev;
        break;
      }
    }

    // j = -1 means no element is
    // found in a[i] so return 0
    if (j == -1)
      return 0;
  }

  return sum;
}

// Driver program to test maximumSum
int main() {
  int arr[][M] = {{1, 7, 3, 4}, 
                  {4, 2, 5, 1}, 
                  {9, 5, 1, 8}};
  int n = sizeof(arr) / sizeof(arr[0]);
  cout << maximumSum(arr, n);
  return 0;
}
Output:

18

Worst Case Time Complexity : O(mn Log m)

We can optimize above solution to work in O(mn). We can skip sorting to find the maximum elements.

// CPP program to find maximum sum
// by selecting a element from n arrays
#include <bits/stdc++.h>
#define M 4
using namespace std;

// To calculate maximum sum by
// selecting element from each array
int maximumSum(int a[][M], int n) {

  // Store maximum element of last array
  int prev = *max_element(&a[n-1][0],
                   &a[n-1][M-1] + 1);

  // Selecting maximum element from
  // previoulsy selected element
  int sum = prev;
  for (int i = n - 2; i >= 0; i--) {

    int max_smaller = INT_MIN;
    for (int j = M - 1; j >= 0; j--) {
      if (a[i][j] < prev &&
          a[i][j] > max_smaller)
        max_smaller = a[i][j];
    }

    // max_smaller equals to INT_MIN means
    // no element is found in a[i] so
    // return 0
    if (max_smaller == INT_MIN)
      return 0;

    prev = max_smaller;
    sum += max_smaller;
  }

  return sum;
}

// Driver program to test maximumSum
int main() {
  int arr[][M] = {{1, 7, 3, 4},
                  {4, 2, 5, 1},
                  {9, 5, 1, 8}};
  int n = sizeof(arr) / sizeof(arr[0]);
  cout << maximumSum(arr, n);
  return 0;
}
Output:

18

Time Complexity : O(mn)




Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.




Practice Tags :
Article Tags :
Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



2.2 Average Difficulty : 2.2/5.0
Based on 4 vote(s)