给定两个分别由N和M 个整数组成的数组A[]和B[] ,任务是计算通过合并两个数组可以获得的最大前缀和。
例子:
Input : A[] = {2, -1, 4, -5}, B[]={4, -3, 12, 4, -3}
Output : 22
Explanation: Merging the two arrays to generate the sequence {2, 4, -1, -3, 4, 12, 4, -5, -3}. Maximum prefix sum = Sum of {arr[0], …, arr[6]} = 22.
Input: A[] = {2, 1, 13, 5, 14}, B={-1, 4, -13}
Output: 38
Explanation: Merging the two arrays to generate the sequence {2, 1, -1, 13, 5, 14, -13}. Maximum prefix sum = Sum of {arr[0], …, arr[6]} = 38.
朴素的方法:最简单的方法是使用递归,可以使用 Memoization 对其进行优化。请按照以下步骤解决问题:
- 初始化一个 map
, int> dp[]以供记忆。 - 定义一个递归函数,比如maxPresum(x, y)来找到最大前缀和:
- 如果DP [{X,Y}]已经计算出,然后返回DP [{X,Y}]。
- 否则,如果x==N || y==M,然后返回0 。
- 将dp[{x, y}] 更新为dp[{x, y}] = max(dp[{x, y}, a[x]+maxPresum(x+1, y), b[y]+maxPresum( x, y+1))然后返回dp[{x, y}]。
- 将最大前缀和打印为maxPresum(0, 0) 。
下面是上述方法的实现:
C++
// C++ implementation of above approach
#include
#define int long long
using namespace std;
// Stores the dp states
map, int> dp;
// Recursive Function to calculate the maximum
// prefix sum ontained by merging two arrays
int maxPreSum(vector a, vector b,
int x, int y)
{
// If subproblem is already computed
if (dp.find({ x, y }) != dp.end())
return dp[{ x, y }];
// If x >= N or y >= M
if (x == a.size() && y == b.size())
return 0;
int curr = dp[{ x, y }];
// If x < N
if (x == a.size()) {
curr = max(curr, b[y]
+ maxPreSum(a, b, x, y + 1));
}
// If y A = { 2, 1, 13, 5, 14 };
vector B = { -1, 4, -13 };
cout << maxPreSum(A, B, 0, 0) << endl;
return 0;
}
C#
// C# implementation of above approach
using System;
using System.Collections.Generic;
class GFG{
// Stores the dp states
static Dictionary, int> dp = new Dictionary, int>();
// Recursive Function to calculate the maximum
// prefix sum ontained by merging two arrays
static int maxPreSum(int[] a, int[] b, int x, int y)
{
// If subproblem is already computed
if (dp.ContainsKey(new Tuple(x, y)))
return dp[new Tuple(x, y)];
// If x >= N or y >= M
if (x == a.Length && y == b.Length)
return 0;
int curr = 0;
if (dp.ContainsKey(new Tuple(x, y)))
{
curr = dp[new Tuple(x, y)];
}
// If x < N
if (x == a.Length)
{
curr = Math.Max(curr, b[y] + maxPreSum(
a, b, x, y + 1));
}
// If y(x, y)] = curr;
return dp[new Tuple(x, y)];
}
// Driver code
static void Main()
{
int[] A = { 2, 1, 13, 5, 14 };
int[] B = { -1, 4, -13 };
Console.WriteLine(maxPreSum(A, B, 0, 0));
}
}
// This code is contributed by divyesh072019
C++
// C++ Program to implement
// the above approach
#include
using namespace std;
int maxPresum(vector a, vector b)
{
// Stores the maximum prefix
// sum of the array A[]
int X = max(a[0], 0);
// Traverse the array A[]
for (int i = 1; i < a.size(); i++) {
a[i] += a[i - 1];
X = max(X, a[i]);
}
// Stores the maximum prefix
// sum of the array B[]
int Y = max(b[0], 0);
// Traverse the array B[]
for (int i = 1; i < b.size(); i++) {
b[i] += b[i - 1];
Y = max(Y, b[i]);
}
return X + Y;
}
// Driver code
int main()
{
vector A = { 2, -1, 4, -5 };
vector B = { 4, -3, 12, 4, -3 };
cout << maxPresum(A, B) << endl;
}
Java
// Java Program to implement
// the above approach
import java.util.*;
class GFG {
static int maxPresum(int [] a, int [] b)
{
// Stores the maximum prefix
// sum of the array A[]
int X = Math.max(a[0], 0);
// Traverse the array A[]
for (int i = 1; i < a.length; i++)
{
a[i] += a[i - 1];
X = Math.max(X, a[i]);
}
// Stores the maximum prefix
// sum of the array B[]
int Y = Math.max(b[0], 0);
// Traverse the array B[]
for (int i = 1; i < b.length; i++) {
b[i] += b[i - 1];
Y = Math.max(Y, b[i]);
}
return X + Y;
}
// Driver code
public static void main(String [] args)
{
int [] A = { 2, -1, 4, -5 };
int [] B = { 4, -3, 12, 4, -3 };
System.out.print(maxPresum(A, B));
}
}
// This code is contributed by ukasp.
Python3
# Python3 implementation of the
# above approach
def maxPresum(a, b) :
# Stores the maximum prefix
# sum of the array A[]
X = max(a[0], 0)
# Traverse the array A[]
for i in range(1, len(a)):
a[i] += a[i - 1]
X = max(X, a[i])
# Stores the maximum prefix
# sum of the array B[]
Y = max(b[0], 0)
# Traverse the array B[]
for i in range(1, len(b)):
b[i] += b[i - 1]
Y = max(Y, b[i])
return X + Y
# Driver code
A = [ 2, -1, 4, -5 ]
B = [ 4, -3, 12, 4, -3 ]
print(maxPresum(A, B))
# This code is contributed by code_hunt.
C#
// C# Program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG {
static int maxPresum(List a, List b)
{
// Stores the maximum prefix
// sum of the array A[]
int X = Math.Max(a[0], 0);
// Traverse the array A[]
for (int i = 1; i < a.Count; i++)
{
a[i] += a[i - 1];
X = Math.Max(X, a[i]);
}
// Stores the maximum prefix
// sum of the array B[]
int Y = Math.Max(b[0], 0);
// Traverse the array B[]
for (int i = 1; i < b.Count; i++) {
b[i] += b[i - 1];
Y = Math.Max(Y, b[i]);
}
return X + Y;
}
// Driver code
static void Main()
{
List A = new List(new int[]{ 2, -1, 4, -5 });
List B = new List(new int[]{ 4, -3, 12, 4, -3 });
Console.WriteLine(maxPresum(A, B));
}
}
// This code is contributed by divyeshrabadiya07.
Javascript
38
时间复杂度: O(N·M)
辅助空间: O(N*M)
高效方法:上述方法可以基于最大前缀总和等于数组A[]和B[]的最大前缀总和的观察进行优化。请按照以下步骤解决问题:
- 计算数组A[]的最大前缀和并将其存储在一个变量中,比如X。
- 计算数组B[]的最大前缀和并将其存储在一个变量中,比如Y。
- 打印X和Y的总和。
下面是上述方法的实现:
C++
// C++ Program to implement
// the above approach
#include
using namespace std;
int maxPresum(vector a, vector b)
{
// Stores the maximum prefix
// sum of the array A[]
int X = max(a[0], 0);
// Traverse the array A[]
for (int i = 1; i < a.size(); i++) {
a[i] += a[i - 1];
X = max(X, a[i]);
}
// Stores the maximum prefix
// sum of the array B[]
int Y = max(b[0], 0);
// Traverse the array B[]
for (int i = 1; i < b.size(); i++) {
b[i] += b[i - 1];
Y = max(Y, b[i]);
}
return X + Y;
}
// Driver code
int main()
{
vector A = { 2, -1, 4, -5 };
vector B = { 4, -3, 12, 4, -3 };
cout << maxPresum(A, B) << endl;
}
Java
// Java Program to implement
// the above approach
import java.util.*;
class GFG {
static int maxPresum(int [] a, int [] b)
{
// Stores the maximum prefix
// sum of the array A[]
int X = Math.max(a[0], 0);
// Traverse the array A[]
for (int i = 1; i < a.length; i++)
{
a[i] += a[i - 1];
X = Math.max(X, a[i]);
}
// Stores the maximum prefix
// sum of the array B[]
int Y = Math.max(b[0], 0);
// Traverse the array B[]
for (int i = 1; i < b.length; i++) {
b[i] += b[i - 1];
Y = Math.max(Y, b[i]);
}
return X + Y;
}
// Driver code
public static void main(String [] args)
{
int [] A = { 2, -1, 4, -5 };
int [] B = { 4, -3, 12, 4, -3 };
System.out.print(maxPresum(A, B));
}
}
// This code is contributed by ukasp.
蟒蛇3
# Python3 implementation of the
# above approach
def maxPresum(a, b) :
# Stores the maximum prefix
# sum of the array A[]
X = max(a[0], 0)
# Traverse the array A[]
for i in range(1, len(a)):
a[i] += a[i - 1]
X = max(X, a[i])
# Stores the maximum prefix
# sum of the array B[]
Y = max(b[0], 0)
# Traverse the array B[]
for i in range(1, len(b)):
b[i] += b[i - 1]
Y = max(Y, b[i])
return X + Y
# Driver code
A = [ 2, -1, 4, -5 ]
B = [ 4, -3, 12, 4, -3 ]
print(maxPresum(A, B))
# This code is contributed by code_hunt.
C#
// C# Program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG {
static int maxPresum(List a, List b)
{
// Stores the maximum prefix
// sum of the array A[]
int X = Math.Max(a[0], 0);
// Traverse the array A[]
for (int i = 1; i < a.Count; i++)
{
a[i] += a[i - 1];
X = Math.Max(X, a[i]);
}
// Stores the maximum prefix
// sum of the array B[]
int Y = Math.Max(b[0], 0);
// Traverse the array B[]
for (int i = 1; i < b.Count; i++) {
b[i] += b[i - 1];
Y = Math.Max(Y, b[i]);
}
return X + Y;
}
// Driver code
static void Main()
{
List A = new List(new int[]{ 2, -1, 4, -5 });
List B = new List(new int[]{ 4, -3, 12, 4, -3 });
Console.WriteLine(maxPresum(A, B));
}
}
// This code is contributed by divyeshrabadiya07.
Javascript
22
时间复杂度: O(M+N)
辅助空间: O(1)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live