Reverse a subarray to maximize sum of even-indexed elements of given array
Last Updated :
02 Aug, 2021
Given an array arr[], the task is to maximize the sum of even-indexed elements by reversing a subarray and print the maximum sum obtained.
Examples:
Input: arr[] = {1, 2, 1, 2, 1}
Output: 5
Explanation:
Sum of initial even-indexed elements = a[0] + a[2] + a[4] = 1 + 1 + 1 = 3
Reversing subarray {1, 2, 1, 2} modifies the array to {2, 1, 2, 1, 1}.
Hence, the maximized sum = 2 + 2 + 1 = 5
Input: arr[] = {7, 8, 4, 5, 7, 6, 8, 9, 7, 3}
Output: 37
Naive Approach:
The simplest approach to solve the problem is to generate all the possible permutations by reversal of elements one by one and calculate the sum at even indices for each permutation. Print the maximum possible sum among all the permutations.
Time Complexity: O(N3)
Auxiliary Space: O(N)
Efficient Approach:
The above approach can be further optimized to O(N) computational complexity by using Dynamic Programming to check the maximum difference by rotation of arrays.
Follow the steps below to solve the problem:
- Compare the elements at odd index with even index and also keep track of them.
- Initialize two arrays leftDP[] and rightDP[].
- For every odd index, leftDP[] stores the difference of the element at current index with the element on its left and rightDP[] stores that of the right.
- If the difference calculated for the previous index is positive, add it to the current difference:
if(dp[i – 1] > 0)
dp[i] = dp[i-1] + curr_diff
- Otherwise, store the current difference:
dp[i] = curr_diff;
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maximizeSum( int arr[], int n)
{
int sum = 0;
for ( int i = 0; i < n; i = i + 2)
sum += arr[i];
int leftDP[n / 2];
int rightDP[n / 2];
int c = 0;
for ( int i = 1; i < n; i = i + 2)
{
int leftDiff = arr[i] - arr[i - 1];
if (c - 1 < 0)
leftDP = leftDiff;
else
{
if (leftDP > 0)
leftDP = leftDiff + leftDP;
else
leftDP[i] = leftDiff;
}
int rightDiff;
if (i + 1 >= n)
rightDiff = 0;
else
rightDiff = arr[i] - arr[i + 1];
if (c - 1 < 0)
rightDP = rightDiff;
else
{
if (rightDP > 0)
rightDP = rightDiff +
rightDP;
else
rightDP = rightDiff;
}
c++;
}
int maxi = 0;
for ( int i = 0; i < n / 2; i++)
{
maxi = max(maxi, max(leftDP[i],
rightDP[i]));
}
return maxi + sum;
}
int main()
{
int arr[] = { 7, 8, 4, 5, 7,
6, 8, 9, 7, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
int ans = maximizeSum(arr, n);
cout << (ans);
}
|
Java
import java.io.*;
class GFG {
public static int maximizeSum( int [] arr)
{
int n = arr.length;
int sum = 0 ;
for ( int i = 0 ; i < n; i = i + 2 )
sum += arr[i];
int leftDP[] = new int [n / 2 ];
int rightDP[] = new int [n / 2 ];
int c = 0 ;
for ( int i = 1 ; i < n; i = i + 2 ) {
int leftDiff = arr[i]
- arr[i - 1 ];
if (c - 1 < 0 )
leftDP = leftDiff;
else {
if (leftDP > 0 )
leftDP = leftDiff
+ leftDP;
else
leftDP[i] = leftDiff;
}
int rightDiff;
if (i + 1 >= arr.length)
rightDiff = 0 ;
else
rightDiff = arr[i]
- arr[i + 1 ];
if (c - 1 < 0 )
rightDP = rightDiff;
else {
if (rightDP > 0 )
rightDP = rightDiff
+ rightDP;
else
rightDP = rightDiff;
}
c++;
}
int max = 0 ;
for ( int i = 0 ; i < n / 2 ; i++) {
max = Math.max(max,
Math.max(
leftDP[i],
rightDP[i]));
}
return max + sum;
}
public static void main(String[] args)
{
int arr[] = { 7 , 8 , 4 , 5 , 7 , 6 ,
8 , 9 , 7 , 3 };
int ans = maximizeSum(arr);
System.out.println(ans);
}
}
|
Python3
def maximizeSum(arr):
n = len (arr)
sum = 0
for i in range ( 0 , n, 2 ):
sum + = arr[i]
leftDP = [ 0 ] * (n)
rightDP = [ 0 ] * (n)
c = 0
for i in range ( 1 , n, 2 ):
leftDiff = arr[i] - arr[i - 1 ]
if (c - 1 < 0 ):
leftDP[i] = leftDiff
else :
if (leftDP[i] > 0 ):
leftDP[i] = (leftDiff +
leftDP[i - 1 ])
else :
leftDP[i] = leftDiff
rightDiff = 0
if (i + 1 > = len (arr)):
rightDiff = 0
else :
rightDiff = arr[i] - arr[i + 1 ]
if (c - 1 < 0 ):
rightDP[i] = rightDiff
else :
if (rightDP[i] > 0 ):
rightDP[i] = (rightDiff +
rightDP[i - 1 ])
else :
rightDP[i] = rightDiff
c + = 1
maxm = 0
for i in range (n / / 2 ):
maxm = max (maxm, max (leftDP[i],
rightDP[i]))
return maxm + sum
if __name__ = = '__main__' :
arr = [ 7 , 8 , 4 , 5 , 7 ,
6 , 8 , 9 , 7 , 3 ]
ans = maximizeSum(arr)
print (ans)
|
C#
using System;
class GFG{
public static int maximizeSum( int [] arr)
{
int n = arr.Length;
int sum = 0;
for ( int i = 0; i < n; i = i + 2)
sum += arr[i];
int []leftDP = new int [n / 2];
int []rightDP = new int [n / 2];
int c = 0;
for ( int i = 1; i < n; i = i + 2)
{
int leftDiff = arr[i] - arr[i - 1];
if (c - 1 < 0)
leftDP = leftDiff;
else
{
if (leftDP > 0)
leftDP = leftDiff +
leftDP;
else
leftDP = leftDiff;
}
int rightDiff;
if (i + 1 >= arr.Length)
rightDiff = 0;
else
rightDiff = arr[i] - arr[i + 1];
if (c - 1 < 0)
rightDP = rightDiff;
else
{
if (rightDP > 0)
rightDP = rightDiff +
rightDP;
else
rightDP = rightDiff;
}
c++;
}
int max = 0;
for ( int i = 0; i < n / 2; i++)
{
max = Math.Max(max,
Math.Max(leftDP[i],
rightDP[i]));
}
return max + sum;
}
public static void Main(String[] args)
{
int []arr = { 7, 8, 4, 5, 7, 6,
8, 9, 7, 3 };
int ans = maximizeSum(arr);
Console.WriteLine(ans);
}
}
|
Javascript
<script>
function maximizeSum(arr)
{
let n = arr.length;
let sum = 0;
for (let i = 0; i < n; i = i + 2)
sum += arr[i];
let leftDP = new Array(Math.floor(n / 2));
let rightDP = new Array(Math.floor(n / 2));
for (let i=0;i<n/2;i++)
{
leftDP[i]=0;
rightDP[i]=0;
}
let c = 0;
for (let i = 1; i < n; i = i + 2) {
let leftDiff = arr[i]
- arr[i - 1];
if (c - 1 < 0)
leftDP[i] = leftDiff;
else {
if (leftDP[i] > 0)
leftDP[i] = leftDiff
+ leftDP[i-1];
else
leftDP[i] = leftDiff;
}
let rightDiff;
if (i + 1 >= arr.length)
rightDiff = 0;
else
rightDiff = arr[i]
- arr[i + 1];
if (c - 1 < 0)
rightDP[i] = rightDiff;
else {
if (rightDP[i] > 0)
rightDP[i] = rightDiff
+ rightDP[i-1];
else
rightDP[i] = rightDiff;
}
c++;
}
let max = 0;
for (let i = 0; i < n / 2; i++) {
max = Math.max(max,
Math.max(
leftDP[i],
rightDP[i]));
}
return max + sum;
}
let arr=[7, 8, 4, 5, 7, 6,
8, 9, 7, 3];
let ans = maximizeSum(arr);
document.write(ans);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...