Related Articles

# Maximum sum of increasing order elements from n arrays

• Difficulty Level : Easy
• Last Updated : 08 Apr, 2021

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 the last array. We pick the maximum element from the last array, then we move to the second last array. In the second last array, we find the largest element which is smaller than the maximum element picked from the last array. We repeat this process until we reach the 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 the array then return 0.

## C++

 `// CPP program to find maximum sum``// by selecting a element from n arrays``#include ``#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

 `= 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``?>`

## Javascript

 ``
Output:
`18`

The 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 ``#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;``}`

## Java

 `// Java program to find``// maximum sum by selecting``// a element from n arrays``import` `java.util.*;``class` `GFG{`` ` `static` `int` `M = ``4``;` `// To calculate maximum sum``// by selecting element from``// each array``static` `int` `maximumSum(``int` `a[][],``                      ``int` `n)``{``  ``// Store maximum element``  ``// of last array``  ``int` `prev = Math.max(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 = Integer.MIN_VALUE;``    ``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 == Integer.MIN_VALUE)``      ``return` `0``;` `    ``prev = max_smaller;``    ``sum += max_smaller;``  ``}` `  ``return` `sum;``}` `// Driver code``public` `static` `void` `main(String []args)``{``  ``int` `arr[][] = {{``1``, ``7``, ``3``, ``4``},``                 ``{``4``, ``2``, ``5``, ``1``},``                 ``{``9``, ``5``, ``1``, ``8``}};``  ``int` `n = arr.length;``  ``System.out.print(maximumSum(arr, n)); ``}``}` `// This code is contributed by Chitranayal`

## 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`

## C#

 `// C# program to find``// maximum sum by selecting``// a element from n arrays``using` `System;``class` `GFG``{``  ``static` `int` `M = 4;` `  ``// To calculate maximum sum``  ``// by selecting element from``  ``// each array``  ``static` `int` `maximumSum(``int``[,] a, ``int` `n)``  ``{` `    ``// Store maximum element``    ``// of last array``    ``int` `prev = Math.Max(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 = Int32.MinValue;``      ``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 == Int32.MinValue)``      ``{``        ``return` `0;``      ``}``      ``prev = max_smaller;``      ``sum += max_smaller;``    ``}``    ``return` `sum;``  ``}` `  ``// Driver code``  ``static` `public` `void` `Main ()``  ``{``    ``int``[,] arr = {{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 avanitrachhadiya2155`

## Javascript

 ``
Output:

`18`

Time Complexity: O(mn)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up