给定两个数组, A[]和B[],每个数组的长度为N ,其中A[i]和B[i]分别是第i个项目在A市场和B市场销售时的价格。任务是最大化销售所有N件商品的配置文件,但有一个问题:如果您去了市场B,那么您将无法返回。例如,如果您在 A 市场出售前 k 件商品,而您必须在 B 市场出售其余商品。
例子:
Input: A[] = {2, 3, 2}, B[] = {10, 3, 40}
Output: 53
Sell all the items in market B in order to
maximize the profit i.e. (10 + 3 + 40) = 53.
Input: A[] = {7, 5, 3, 4}, B[] = {2, 3, 1, 3}
Output: 19
方法:
- 创建一个前缀总和数组preA[] ,其中preA[i]将存储A[0…i]商品在市场A中出售时的利润。
- 创建一个后缀和数组suffB[] ,其中suffB[i]将存储B[i…n-1]在市场B 中出售时的利润。
- 现在问题简化为找到一个索引i使得(preA[i] + suffB[i + 1])是最大值。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to calculate max profit
int maxProfit(int profitA[], int profitB[], int n)
{
// Prefix sum array for profitA[]
int preSum[n];
preSum[0] = profitA[0];
for (int i = 1; i < n; i++) {
preSum[i] = preSum[i - 1] + profitA[i];
}
// Suffix sum array for profitB[]
int suffSum[n];
suffSum[n - 1] = profitB[n - 1];
for (int i = n - 2; i >= 0; i--) {
suffSum[i] = suffSum[i + 1] + profitB[i];
}
// If all the items are sold in market A
int res = preSum[n - 1];
// Find the maximum profit when the first i
// items are sold in market A and the
// rest of the items are sold in market
// B for all possible values of i
for (int i = 1; i < n - 1; i++) {
res = max(res, preSum[i] + suffSum[i + 1]);
}
// If all the items are sold in market B
res = max(res, suffSum[0]);
return res;
}
// Driver code
int main()
{
int profitA[] = { 2, 3, 2 };
int profitB[] = { 10, 30, 40 };
int n = sizeof(profitA) / sizeof(int);
// Function to calculate max profit
cout << maxProfit(profitA, profitB, n);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function to calculate max profit
static int maxProfit(int profitA[], int profitB[], int n)
{
// Prefix sum array for profitA[]
int preSum[] = new int[n];
preSum[0] = profitA[0];
for (int i = 1; i < n; i++)
{
preSum[i] = preSum[i - 1] + profitA[i];
}
// Suffix sum array for profitB[]
int suffSum[] = new int[n];
suffSum[n - 1] = profitB[n - 1];
for (int i = n - 2; i >= 0; i--)
{
suffSum[i] = suffSum[i + 1] + profitB[i];
}
// If all the items are sold in market A
int res = preSum[n - 1];
// Find the maximum profit when the first i
// items are sold in market A and the
// rest of the items are sold in market
// B for all possible values of i
for (int i = 1; i < n - 1; i++)
{
res = Math.max(res, preSum[i] + suffSum[i + 1]);
}
// If all the items are sold in market B
res = Math.max(res, suffSum[0]);
return res;
}
// Driver code
public static void main (String[] args)
{
int profitA[] = { 2, 3, 2 };
int profitB[] = { 10, 30, 40 };
int n = profitA.length;
// Function to calculate max profit
System.out.println(maxProfit(profitA, profitB, n));
}
}
// This code is contributed by AnkitRai01
Python3
# Python3 implementation of the approach
# Function to calculate max profit
def maxProfit(profitA, profitB, n) :
# Prefix sum array for profitA[]
preSum = [0] * n;
preSum[0] = profitA[0];
for i in range(1, n) :
preSum[i] = preSum[i - 1] + profitA[i];
# Suffix sum array for profitB[]
suffSum = [0] * n;
suffSum[n - 1] = profitB[n - 1];
for i in range(n - 2, -1, -1) :
suffSum[i] = suffSum[i + 1] + profitB[i];
# If all the items are sold in market A
res = preSum[n - 1];
# Find the maximum profit when the first i
# items are sold in market A and the
# rest of the items are sold in market
# B for all possible values of i
for i in range(1 , n - 1) :
res = max(res, preSum[i] + suffSum[i + 1]);
# If all the items are sold in market B
res = max(res, suffSum[0]);
return res;
# Driver code
if __name__ == "__main__" :
profitA = [ 2, 3, 2 ];
profitB = [ 10, 30, 40 ];
n = len(profitA);
# Function to calculate max profit
print(maxProfit(profitA, profitB, n));
# This code is contributed by AnkitRai01
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to calculate max profit
static int maxProfit(int []profitA,
int []profitB, int n)
{
// Prefix sum array for profitA[]
int []preSum = new int[n];
preSum[0] = profitA[0];
for (int i = 1; i < n; i++)
{
preSum[i] = preSum[i - 1] + profitA[i];
}
// Suffix sum array for profitB[]
int []suffSum = new int[n];
suffSum[n - 1] = profitB[n - 1];
for (int i = n - 2; i >= 0; i--)
{
suffSum[i] = suffSum[i + 1] + profitB[i];
}
// If all the items are sold in market A
int res = preSum[n - 1];
// Find the maximum profit when the first i
// items are sold in market A and the
// rest of the items are sold in market
// B for all possible values of i
for (int i = 1; i < n - 1; i++)
{
res = Math.Max(res, preSum[i] +
suffSum[i + 1]);
}
// If all the items are sold in market B
res = Math.Max(res, suffSum[0]);
return res;
}
// Driver code
public static void Main(String[] args)
{
int []profitA = { 2, 3, 2 };
int []profitB = { 10, 30, 40 };
int n = profitA.Length;
// Function to calculate max profit
Console.WriteLine(maxProfit(profitA, profitB, n));
}
}
// This code is contributed by 29AjayKumar
Javascript
C++
// C++ implementation of the approach
#include
using namespace std;
int maxProfit(vector a, vector b, int n)
{
// Max profit will be saved here
int maxP = -1;
// loop to check all possible combinations of sales
for (int i = 0; i < n + 1; i++) {
// the sum of the profit after the sale
// for products 0 to i in market A
int sumA = 0;
for (int j = 0; j < min(i, (int)a.size()); j++)
sumA += a[j];
// the sum of the profit after the sale
// for products i to n in market B
int sumB = 0;
for (int j = i; j < b.size(); j++)
sumB += b[j];
// Replace the value of Max Profit with a
// bigger value among maxP and sumA+sumB
maxP = max(maxP, sumA + sumB);
}
// Return the value of Max Profit
return maxP;
}
// Driver Program11111111111111111111111
int main()
{
vector a = { 2, 3, 2 };
vector b = { 10, 30, 40 };
cout << maxProfit(a, b, 4);
return 0;
}
// This code is contributed by pankajsharmagfg.
Python3
# Python3 implementation of the approach
def maxProfit (a, b, n):
# Max profit will be saved here
maxP = -1
# loop to check all possible combinations of sales
for i in range(0, n+1):
# the sum of the profit after the sale
# for products 0 to i in market A
sumA = sum(a[:i])
# the sum of the profit after the sale
# for products i to n in market B
sumB = sum(b[i:])
# Replace the value of Max Profit with a
# bigger value among maxP and sumA+sumB
maxP = max(maxP, sumA+sumB)
# Return the value of Max Profit
return maxP
# Driver Program
if __name__ == "__main__" :
a = [2, 3, 2]
b = [10, 30, 40]
print(maxProfit(a, b, 4))
# This code is contributed by aman_malhotra
输出:
80
Python的替代实现:
C++
// C++ implementation of the approach
#include
using namespace std;
int maxProfit(vector a, vector b, int n)
{
// Max profit will be saved here
int maxP = -1;
// loop to check all possible combinations of sales
for (int i = 0; i < n + 1; i++) {
// the sum of the profit after the sale
// for products 0 to i in market A
int sumA = 0;
for (int j = 0; j < min(i, (int)a.size()); j++)
sumA += a[j];
// the sum of the profit after the sale
// for products i to n in market B
int sumB = 0;
for (int j = i; j < b.size(); j++)
sumB += b[j];
// Replace the value of Max Profit with a
// bigger value among maxP and sumA+sumB
maxP = max(maxP, sumA + sumB);
}
// Return the value of Max Profit
return maxP;
}
// Driver Program11111111111111111111111
int main()
{
vector a = { 2, 3, 2 };
vector b = { 10, 30, 40 };
cout << maxProfit(a, b, 4);
return 0;
}
// This code is contributed by pankajsharmagfg.
蟒蛇3
# Python3 implementation of the approach
def maxProfit (a, b, n):
# Max profit will be saved here
maxP = -1
# loop to check all possible combinations of sales
for i in range(0, n+1):
# the sum of the profit after the sale
# for products 0 to i in market A
sumA = sum(a[:i])
# the sum of the profit after the sale
# for products i to n in market B
sumB = sum(b[i:])
# Replace the value of Max Profit with a
# bigger value among maxP and sumA+sumB
maxP = max(maxP, sumA+sumB)
# Return the value of Max Profit
return maxP
# Driver Program
if __name__ == "__main__" :
a = [2, 3, 2]
b = [10, 30, 40]
print(maxProfit(a, b, 4))
# This code is contributed by aman_malhotra
输出:
80
时间复杂度: O(N)
辅助空间: O(N)