Given an array arr[] of N positive integers, the task is to split the array into two contiguous subarrays such that the product of the sum of two contiguous subarrays is maximum.
Examples:
Input: arr[] = {4, 10, 1, 7, 2, 9}
Output: 270
All possible partitions and their product of sum are:
{4} and {10, 1, 7, 2, 9} -> product of sum = 116
{4, 10} and {1, 7, 2, 9} -> product of sum = 266
{4, 10, 1} and {7, 2, 9} -> product of sum = 270
{4, 10, 1, 7} and {2, 9} -> product of sum = 242
{4, 10, 1, 7, 2} and {9} -> product of sum = 216
Input: arr[] = {4, 10, 11, 10, 4}
Output: 350
Naive approach: A simple approach is to consider all the possible partitions for the subarrays one by one and calculate the maximum product of the sum of the subarrays.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maxProdSum( int arr[], int n)
{
int leftArraySum = 0, maxProduct = 0;
for ( int i = 0; i < n; i++) {
leftArraySum += arr[i];
int rightArraySum = 0;
for ( int j = i + 1; j < n; j++) {
rightArraySum += arr[j];
}
int k = leftArraySum * rightArraySum;
if (k > maxProduct) {
maxProduct = k;
}
}
return maxProduct;
}
int main()
{
int arr[] = { 4, 10, 1, 7, 2, 9 };
int n = sizeof (arr) / sizeof ( int );
cout << maxProdSum(arr, n);
return 0;
}
|
Java
class GFG
{
static int maxProdSum( int arr[], int n)
{
int leftArraySum = 0 , maxProduct = 0 ;
for ( int i = 0 ; i < n; i++)
{
leftArraySum += arr[i];
int rightArraySum = 0 ;
for ( int j = i + 1 ; j < n; j++)
{
rightArraySum += arr[j];
}
int k = leftArraySum * rightArraySum;
if (k > maxProduct)
{
maxProduct = k;
}
}
return maxProduct;
}
public static void main(String[] args)
{
int arr[] = { 4 , 10 , 1 , 7 , 2 , 9 };
int n = arr.length;
System.out.print(maxProdSum(arr, n));
}
}
|
Python3
def maxProdSum(arr, n):
leftArraySum = 0 ;
maxProduct = 0 ;
for i in range (n):
leftArraySum + = arr[i];
rightArraySum = 0 ;
for j in range (i + 1 , n):
rightArraySum + = arr[j];
k = leftArraySum * rightArraySum;
if (k > maxProduct):
maxProduct = k;
return maxProduct;
if __name__ = = '__main__' :
arr = [ 4 , 10 , 1 , 7 , 2 , 9 ];
n = len (arr);
print (maxProdSum(arr, n));
|
C#
using System;
class GFG
{
static int maxProdSum( int []arr, int n)
{
int leftArraySum = 0, maxProduct = 0;
for ( int i = 0; i < n; i++)
{
leftArraySum += arr[i];
int rightArraySum = 0;
for ( int j = i + 1; j < n; j++)
{
rightArraySum += arr[j];
}
int k = leftArraySum * rightArraySum;
if (k > maxProduct)
{
maxProduct = k;
}
}
return maxProduct;
}
public static void Main(String[] args)
{
int []arr = { 4, 10, 1, 7, 2, 9 };
int n = arr.Length;
Console.Write(maxProdSum(arr, n));
}
}
|
Javascript
<script>
function maxProdSum(arr, n) {
let leftArraySum = 0, maxProduct = 0;
for (let i = 0; i < n; i++) {
leftArraySum += arr[i];
let rightArraySum = 0;
for (let j = i + 1; j < n; j++) {
rightArraySum += arr[j];
}
let k = leftArraySum * rightArraySum;
if (k > maxProduct) {
maxProduct = k;
}
}
return maxProduct;
}
let arr = [4, 10, 1, 7, 2, 9];
let n = arr.length;
document.write(maxProdSum(arr, n));
</script>
|
Time Complexity: O(N2)
Auxiliary Space: O(1)
Efficient approach: A better approach is to use the concept prefix array sum which helps in calculating the sum of both the contiguous subarrays.
- The prefix sum of the elements can be calculated.
- The left array sum is the value at ith position.
- The right array sum is the value at the last position – ith position.
- Now calculate k, the product of some of these left and right subarrays.
- Find and print the maximum of the product of these arrays.
Below is the implementation of the above approach:
CPP
#include <bits/stdc++.h>
using namespace std;
int maxProdSum( int arr[], int n)
{
int prefixArraySum[n], maxProduct = 0;
prefixArraySum[0] = arr[0];
for ( int i = 1; i < n; i++) {
prefixArraySum[i] = prefixArraySum[i - 1]
+ arr[i];
}
for ( int i = 0; i < n - 1; i++) {
int leftArraySum = prefixArraySum[i];
int rightArraySum = prefixArraySum[n - 1]
- prefixArraySum[i];
int k = leftArraySum * rightArraySum;
if (k > maxProduct) {
maxProduct = k;
}
}
return maxProduct;
}
int main()
{
int arr[] = { 4, 10, 1, 7, 2, 9 };
int n = sizeof (arr) / sizeof ( int );
cout << maxProdSum(arr, n);
return 0;
}
|
Java
class GFG
{
static int maxProdSum( int arr[], int n)
{
int []prefixArraySum = new int [n];
int maxProduct = 0 ;
prefixArraySum[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
{
prefixArraySum[i] = prefixArraySum[i - 1 ]
+ arr[i];
}
for ( int i = 0 ; i < n - 1 ; i++)
{
int leftArraySum = prefixArraySum[i];
int rightArraySum = prefixArraySum[n - 1 ]
- prefixArraySum[i];
int k = leftArraySum * rightArraySum;
if (k > maxProduct)
{
maxProduct = k;
}
}
return maxProduct;
}
public static void main(String[] args)
{
int arr[] = { 4 , 10 , 1 , 7 , 2 , 9 };
int n = arr.length;
System.out.print(maxProdSum(arr, n));
}
}
|
Python3
def maxProdSum(arr, n):
prefixArraySum = [ 0 ] * n
maxProduct = 0
prefixArraySum[ 0 ] = arr[ 0 ]
for i in range ( 1 , n):
prefixArraySum[i] = prefixArraySum[i - 1 ] + arr[i]
for i in range (n - 1 ):
leftArraySum = prefixArraySum[i]
rightArraySum = prefixArraySum[n - 1 ] - \
prefixArraySum[i]
k = leftArraySum * rightArraySum
if (k > maxProduct):
maxProduct = k
return maxProduct
arr = [ 4 , 10 , 1 , 7 , 2 , 9 ]
n = len (arr)
print (maxProdSum(arr, n))
|
C#
using System;
class GFG
{
static int maxProdSum( int []arr, int n)
{
int []prefixArraySum = new int [n];
int maxProduct = 0;
prefixArraySum[0] = arr[0];
for ( int i = 1; i < n; i++)
{
prefixArraySum[i] = prefixArraySum[i - 1]
+ arr[i];
}
for ( int i = 0; i < n - 1; i++)
{
int leftArraySum = prefixArraySum[i];
int rightArraySum = prefixArraySum[n - 1]
- prefixArraySum[i];
int k = leftArraySum * rightArraySum;
if (k > maxProduct)
{
maxProduct = k;
}
}
return maxProduct;
}
public static void Main(String[] args)
{
int []arr = { 4, 10, 1, 7, 2, 9 };
int n = arr.Length;
Console.Write(maxProdSum(arr, n));
}
}
|
Javascript
<script>
function maxProdSum(arr, n)
{
let prefixArraySum = [], maxProduct = 0;
prefixArraySum[0] = arr[0];
for (let i = 1; i < n; i++) {
prefixArraySum[i] = prefixArraySum[i - 1]
+ arr[i];
}
for (let i = 0; i < n - 1; i++) {
let leftArraySum = prefixArraySum[i];
let rightArraySum = prefixArraySum[n - 1]
- prefixArraySum[i];
let k = leftArraySum * rightArraySum;
if (k > maxProduct) {
maxProduct = k;
}
}
return maxProduct;
}
let arr = [ 4, 10, 1, 7, 2, 9 ];
let n = arr.length;
document.write(maxProdSum(arr, n));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)