Open In App

Maximum sum of increasing order elements from n arrays

Improve
Improve
Like Article
Like
Save
Share
Report

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 <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
  // previously 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 previously 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 previously
    # 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 previously 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
    // previously 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
?>


Javascript




<script>
 
// JavaScript program to find
// maximum sum by selecting
// a element from n arrays
 
let M = 4;
  
// To calculate maximum sum
// by selecting element from
// each array
function maximumSum(a, n)
{
  // Store maximum element
  // of last array
  let prev = Math.max(a[n - 1][0],
                      a[n - 1][M - 1] + 1);
  
  // Selecting maximum element from
  // previously selected element
  let sum = prev;
  for (let i = n - 2; i >= 0; i--)
  {
    let max_smaller = Number.MIN_VALUE;
    for (let 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 == Number.MIN_VALUE)
      return 0;
  
    prev = max_smaller;
    sum += max_smaller;
  }
  
  return sum;
}
 
// Driver code
 
        let arr = [[1, 7, 3, 4],
                 [4, 2, 5, 1],
                 [9, 5, 1, 8]];
  let n = arr.length;
  document.write(maximumSum(arr, n));
 
</script>


Output: 

18

 

The Worst-Case Time Complexity: O(mn Log m)
Auxiliary Space: O(1)
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 previously 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;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)


C




// C program to find maximum sum by selecting a element from
// n arrays
#include <limits.h>
#include <stdio.h>
#define M 4
 
// 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 = INT_MAX;
    // Selecting maximum element from previously selected
    // element
    int sum = 0;
    for (int i = n - 1; i >= 0; i--) {
        int max_smaller = INT_MIN;
        for (int j = 0; j < M; j++)
            if (a[i][j] > max_smaller && a[i][j] < prev)
                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]);
    printf("%d", maximumSum(arr, n));
    return 0;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)


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 previously
        // 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 Aditya Kumar (adityakumar129)


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
    # previously 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
    // previously 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




<script>
 
// JavaScript program to find
// maximum sum by selecting
// a element from n arrays
 
let M = 4;
  
// To calculate maximum sum
// by selecting element from
// each array
function maximumSum(a, n)
{
  // Store maximum element
  // of last array
  let prev = Math.max(a[n - 1][0],
                      a[n - 1][M - 1] + 1);
  
  // Selecting maximum element from
  // previously selected element
  let sum = prev;
  for (let i = n - 2; i >= 0; i--)
  {
    let max_smaller = Number.MIN_VALUE;
    for (let 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 == Number.MIN_VALUE)
      return 0;
  
    prev = max_smaller;
    sum += max_smaller;
  }
  
  return sum;
}
 
// Driver code
 
        let arr = [[1, 7, 3, 4],
                 [4, 2, 5, 1],
                 [9, 5, 1, 8]];
  let n = arr.length;
  document.write(maximumSum(arr, n));
 
// This code is contributed by souravghosh0416.
</script>


Output: 

18

 

Time Complexity: O(mn)
Auxiliary Space: O(1)



Last Updated : 12 Oct, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads