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++
#include <bits/stdc++.h>
#define M 4
using namespace std;
int maximumSum( int a[][M], int n) {
for ( int i = 0; i < n; i++)
sort(a[i], a[i] + M);
int sum = a[n - 1][M - 1];
int prev = a[n - 1][M - 1];
int i, j;
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 ;
}
}
if (j == -1)
return 0;
}
return sum;
}
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
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;
}
}
}
static int maximumSum( int a[][],
int n)
{
for ( int i = 0 ; i < n; i++)
sort(a, i, n);
int sum = a[n - 1 ][M - 1 ];
int prev = a[n - 1 ][M - 1 ];
int i, j;
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 ;
}
}
if (j == - 1 )
return 0 ;
}
return sum;
}
public static void main(String args[])
{
int n = arr.length;
System.out.print(maximumSum(arr, n));
}
}
|
Python3
M = 4 ;
def maximumSum(a, n) :
global M;
for i in range ( 0 , n) :
a[i].sort();
sum = a[n - 1 ][M - 1 ];
prev = a[n - 1 ][M - 1 ];
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 ;
if (j = = - 1 ) :
return 0 ;
return sum ;
arr = [[ 1 , 7 , 3 , 4 ],
[ 4 , 2 , 5 , 1 ],
[ 9 , 5 , 1 , 8 ]];
n = len (arr) ;
print (maximumSum(arr, n));
|
C#
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;
}
}
}
static int maximumSum( int [,] a,
int n)
{
int i = 0, j = 0;
for (i = 0; i < n; i++)
sort( ref a, i, n);
int sum = a[n - 1, M - 1];
int prev = a[n - 1, M - 1];
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 ;
}
}
if (j == -1)
return 0;
}
return sum;
}
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));
}
}
|
PHP
<?php
$M = 4;
function maximumSum( $a , $n )
{
global $M ;
for ( $i = 0; $i < $n ; $i ++)
sort( $a [ $i ]);
$sum = $a [ $n - 1][ $M - 1];
$prev = $a [ $n - 1][ $M - 1];
$i ; $j ;
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 ;
}
}
if ( $j == -1)
return 0;
}
return $sum ;
}
$arr = array ( array (1, 7, 3, 4),
array (4, 2, 5, 1),
array (9, 5, 1, 8));
$n = sizeof( $arr ) ;
echo maximumSum( $arr , $n );
?>
|
Javascript
<script>
let M = 4;
function maximumSum(a, n)
{
let prev = Math.max(a[n - 1][0],
a[n - 1][M - 1] + 1);
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];
}
if (max_smaller == Number.MIN_VALUE)
return 0;
prev = max_smaller;
sum += max_smaller;
}
return sum;
}
let arr = [[1, 7, 3, 4],
[4, 2, 5, 1],
[9, 5, 1, 8]];
let n = arr.length;
document.write(maximumSum(arr, n));
</script>
|
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++
#include <bits/stdc++.h>
#define M 4
using namespace std;
int maximumSum( int a[][M], int n)
{
int prev
= *max_element(&a[n - 1][0], &a[n - 1][M - 1] + 1);
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];
if (max_smaller == INT_MIN)
return 0;
prev = max_smaller;
sum += max_smaller;
}
return sum;
}
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;
}
|
C
#include <limits.h>
#include <stdio.h>
#define M 4
int maximumSum( int a[][M], int n)
{
int prev = INT_MAX;
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];
if (max_smaller == INT_MIN)
return 0;
prev = max_smaller;
sum += max_smaller;
}
return sum;
}
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;
}
|
Java
import java.util.*;
class GFG {
static int M = 4 ;
static int maximumSum( int a[][], int n)
{
int prev
= Math.max(a[n - 1 ][ 0 ], a[n - 1 ][M - 1 ] + 1 );
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];
if (max_smaller == Integer.MIN_VALUE)
return 0 ;
prev = max_smaller;
sum += max_smaller;
}
return sum;
}
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));
}
}
|
Python3
M = 4
def maximumSum(a, n):
prev = max ( max (a))
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]
if (max_smaller = = - 10 * * 9 ):
return 0
prev = max_smaller
Sum + = max_smaller
return Sum
arr = [[ 1 , 7 , 3 , 4 ],
[ 4 , 2 , 5 , 1 ],
[ 9 , 5 , 1 , 8 ]]
n = len (arr)
print (maximumSum(arr, n))
|
C#
using System;
class GFG
{
static int M = 4;
static int maximumSum( int [,] a, int n)
{
int prev = Math.Max(a[n - 1, 0],
a[n - 1, M - 1] + 1);
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];
}
}
if (max_smaller == Int32.MinValue)
{
return 0;
}
prev = max_smaller;
sum += max_smaller;
}
return sum;
}
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));
}
}
|
Javascript
<script>
let M = 4;
function maximumSum(a, n)
{
let prev = Math.max(a[n - 1][0],
a[n - 1][M - 1] + 1);
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];
}
if (max_smaller == Number.MIN_VALUE)
return 0;
prev = max_smaller;
sum += max_smaller;
}
return sum;
}
let arr = [[1, 7, 3, 4],
[4, 2, 5, 1],
[9, 5, 1, 8]];
let n = arr.length;
document.write(maximumSum(arr, n));
</script>
|
Time Complexity: O(mn)
Auxiliary Space: O(1)