Maximum sum of increasing order elements from n arrays
Given n arrays of size m each. Find the maximum sum obtained by selecting a number from each array such that the elements selected from the i-th array are more than the element selected from (i-1)-th array. If maximum sum cannot 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 than the previous element. If we are not able to select an element from array then return 0.
C++
// 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; } |
Java
// Java program to find // maximum sum by selecting // a element from n arrays import java.io.*; class GFG { static int M = 4; static int arr[][] = {{1, 7, 3, 4}, {4, 2, 5, 1}, {9, 5, 1, 8}}; static void sort(int a[][], int row, int n) { for (int i = 0; i < M - 1; i++) { if(a[row][i] > a[row][i + 1]) { int temp = a[row][i]; a[row][i] = a[row][i + 1]; a[row][i + 1] = temp; } } } // To calculate maximum // sum by selecting element // from each array static int maximumSum(int a[][], int n) { // Sort each array for (int i = 0; i < n; i++) sort(a, i, n); // 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 Code public static void main(String args[]) { int n = arr.length; System.out.print(maximumSum(arr, n)); } } // This code is contributed by // Manish Shaw(manishshaw1) |
Python3
# Python3 program to find # maximum sum by selecting # a element from n arrays M = 4; # To calculate maximum sum # by selecting element from # each array def maximumSum(a, n) : global M; # Sort each array for i in range(0, n) : a[i].sort(); # Store maximum element # of last array sum = a[n - 1][M - 1]; prev = a[n - 1][M - 1]; # Selecting maximum # element from previoulsy # selected element for i in range(n - 2, -1, -1) : for j in range(M - 1, -1, -1) : 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 Code arr = [[1, 7, 3, 4], [4, 2, 5, 1], [9, 5, 1, 8]]; n = len(arr) ; print (maximumSum(arr, n)); # This code is contributed by # Manish Shaw(manishshaw1) |
C#
// C# program to find maximum // sum by selecting a element // from n arrays using System; class GFG { static int M = 4; static void sort(ref int[,] a, int row, int n) { for (int i = 0; i < M-1; i++) { if(a[row, i] > a[row, i + 1]) { int temp = a[row, i]; a[row, i] = a[row, i + 1]; a[row, i + 1] = temp; } } } // To calculate maximum // sum by selecting // element from each array static int maximumSum(int[,] a, int n) { int i = 0, j = 0; // Sort each array for (i = 0; i < n; i++) sort(ref a, i, n); // Store maximum element // of last array int sum = a[n - 1, M - 1]; int prev = a[n - 1, M - 1]; // 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 Code static void Main() { int [,]arr = new int[,]{{1, 7, 3, 4}, {4, 2, 5, 1}, {9, 5, 1, 8}}; int n = arr.GetLength(0); Console.Write(maximumSum(arr, n)); } } // This code is contributed by // Manish Shaw (manishshaw1) |
PHP
<?php // PHP program to find maximum // sum by selecting a element // from n arrays $M = 4; // To calculate maximum sum // by selecting element from // each array function maximumSum($a, $n) { global $M; // Sort each array for ($i = 0; $i < $n; $i++) sort($a[$i]); // Store maximum element // of last array $sum = $a[$n - 1][$M - 1]; $prev = $a[$n - 1][$M - 1]; $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 Code $arr = array(array(1, 7, 3, 4), array(4, 2, 5, 1), array(9, 5, 1, 8)); $n = sizeof($arr) ; echo maximumSum($arr, $n); // This code is contributed by m_kit ?> |
18
Worst Case Time Complexity : O(mn Log m)
We can optimize the above solution to work in O(mn). We can skip sorting to find the maximum elements.
C++
// 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; } |
Python3
# Python3 program to find maximum sum # by selecting a element from n arrays M = 4 # To calculate maximum sum by # selecting element from each array def maximumSum(a, n): # Store maximum element of last array prev = max(max(a)) # Selecting maximum element from # previoulsy selected element Sum = prev for i in range(n - 2, -1, -1): max_smaller = -10**9 for j in range(M - 1, -1, -1): if (a[i][j] < prev and 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 == -10**9): return 0 prev = max_smaller Sum += max_smaller return Sum # Driver Code arr = [[1, 7, 3, 4], [4, 2, 5, 1], [9, 5, 1, 8]] n = len(arr) print(maximumSum(arr, n)) # This code is contributed by mohit kumar |
18
Time Complexity: O(mn)
Recommended Posts:
- Maximum sum by picking elements from two arrays in order
- Sort even-placed elements in increasing and odd-placed in decreasing order
- Rearrange all elements of array which are multiples of x in increasing order
- Shortest path to traverse all the elements of a circular array in increasing order
- Maximum array from two given arrays keeping order same
- Find all unique pairs of maximum and second maximum elements over all sub-arrays in O(NlogN)
- Find k maximum elements of array in original order
- Maximum sum from three arrays such that picking elements consecutively from same is not allowed
- Sort only non-prime numbers of an array in increasing order
- Minimum increment operations to make the array in increasing order
- Divide array into increasing and decreasing subsequence without changing the order
- Maximum Sum Increasing Subsequence | DP-14
- Maximum product of an increasing subsequence
- Find Maximum Sum Strictly Increasing Subarray
- Partition an array such into maximum increasing segments
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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



