给定n个大小为m的数组。找出通过从每个数组中选择一个数字而获得的最大和,以使从第i个数组中选择的元素大于从第(i-1)个数组中选择的元素。如果无法获得最大和,则返回0。
例子:
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
这个想法是从最后一个数组开始选择。我们从最后一个数组中选取最大元素,然后移至倒数第二个数组。在倒数第二个数组中,我们找到最大元素,该元素小于从最后一个数组中选取的最大元素。我们重复此过程,直到到达第一个数组。
为了获得最大和,我们可以对所有数组进行排序,并从下到上从右到左遍历每个数组,并选择一个大于前一个元素的数字。如果我们无法从数组中选择一个元素,则返回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
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
输出:
18
最坏情况下的时间复杂度:O(mn Log m)
我们可以优化上述解决方案以在O(mn)中工作。我们可以跳过排序以找到最大元素。
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
Java脚本
输出:
18
时间复杂度: O(mn)