Maximum possible array sum after performing the given operation
Last Updated :
18 Apr, 2023
Given an array arr[] of size N, the task is to find the maximum sum of the elements of the array after applying the given operation any number of times. In a single operation, choose an index 1 ? i < N and multiply both arr[i] and arr[i - 1] by -1.
Examples:
Input: arr[] = {-10, 5, -4}
Output: 19
Perform the operation for i = 1 and
the array becomes {10, -5, -4}
Perform the operation for i = 2 and
the array becomes {10, 5, 4}
10 + 5 + 4 = 19
Input: arr[] = {10, -4, -8, -11, 3}
Output: 30
Approach: This problem can be solved using dynamic programming. Since it is useless to choose and flip the same arr[i], we will consider flipping at most once for each element of the array in order from the left. Let dp[i][0] represents the maximum possible sum up to the ith index without flipping the ith index. dp[i][1] represents the maximum possible sum up to the ith index with flipping the ith index. So, dp(n, 0) is our required answer.
Base conditions:
- dp[0][0] = 0
- dp[0][1] = INT_MIN
Recurrence relation:
- dp[i + 1][0] = max(dp[i][0] + arr[i], dp[i][1] - arr[i])
- dp[i + 1][1] = max(dp[i][0] - arr[i], dp[i][1] + arr[i])
Below is the implementation of the above approach:
C++
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
// Function to return the maximum possible
// sum after performing the given operation
int max_sum(int a[], int n)
{
// Dp vector to store the answer
vector<vector<int> > dp(n + 1,
vector<int>(2, 0));
// Base value
dp[0][0] = 0, dp[0][1] = -999999;
for (int i = 0; i <= n - 1; i++) {
dp[i + 1][0] = max(dp[i][0] + a[i],
dp[i][1] - a[i]);
dp[i + 1][1] = max(dp[i][0] - a[i],
dp[i][1] + a[i]);
}
// Return the maximum sum
return dp[n][0];
}
// Driver code
int main()
{
int a[] = { -10, 5, -4 };
int n = sizeof(a) / sizeof(a[0]);
cout << max_sum(a, n);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function to return the maximum possible
// sum after performing the given operation
static int max_sum(int a[], int n)
{
// Dp vector to store the answer
int [][]dp = new int[n + 1][2];
// Base value
dp[0][0] = 0; dp[0][1] = -999999;
for (int i = 0; i <= n - 1; i++)
{
dp[i + 1][0] = Math.max(dp[i][0] + a[i],
dp[i][1] - a[i]);
dp[i + 1][1] = Math.max(dp[i][0] - a[i],
dp[i][1] + a[i]);
}
// Return the maximum sum
return dp[n][0];
}
// Driver code
public static void main(String[] args)
{
int a[] = { -10, 5, -4 };
int n = a.length;
System.out.println(max_sum(a, n));
}
}
// This code is contributed by 29AjayKumar
Python3
# Python implementation of the approach
# Function to return the maximum possible
# sum after performing the given operation
def max_sum(a, n):
# Dp vector to store the answer
dp = [[0 for i in range(2)] for j in range(n+1)]
# Base value
dp[0][0] = 0; dp[0][1] = -999999;
for i in range(0, n):
dp[i + 1][0] = max(dp[i][0] + a[i],
dp[i][1] - a[i]);
dp[i + 1][1] = max(dp[i][0] - a[i],
dp[i][1] + a[i]);
# Return the maximum sum
return dp[n][0];
# Driver code
if __name__ == '__main__':
a = [-10, 5, -4 ];
n = len(a);
print(max_sum(a, n));
# This code is contributed by 29AjayKumar
JavaScript
<script>
// javascript implementation of the approach // Function to return the maximum possible
// sum after performing the given operation
function max_sum(a , n) {
// Dp vector to store the answer
var dp = Array(n + 1).fill().map(()=>Array(2).fill(0));
// Base value
dp[0][0] = 0;
dp[0][1] = -999999;
for (i = 0; i <= n - 1; i++) {
dp[i + 1][0] = Math.max(dp[i][0] + a[i], dp[i][1] - a[i]);
dp[i + 1][1] = Math.max(dp[i][0] - a[i], dp[i][1] + a[i]);
}
// Return the maximum sum
return dp[n][0];
}
// Driver code
var a = [ -10, 5, -4 ];
var n = a.length;
document.write(max_sum(a, n));
// This code is contributed by todaysgaurav
</script>
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the maximum possible
// sum after performing the given operation
static int max_sum(int []a, int n)
{
// Dp vector to store the answer
int [,]dp = new int[n + 1, 2];
// Base value
dp[0, 0] = 0; dp[0, 1] = -999999;
for (int i = 0; i <= n - 1; i++)
{
dp[i + 1, 0] = Math.Max(dp[i, 0] + a[i],
dp[i, 1] - a[i]);
dp[i + 1, 1] = Math.Max(dp[i, 0] - a[i],
dp[i, 1] + a[i]);
}
// Return the maximum sum
return dp[n, 0];
}
// Driver code
public static void Main(String[] args)
{
int []a = { -10, 5, -4 };
int n = a.Length;
Console.WriteLine(max_sum(a, n));
}
}
// This code is contributed by PrinciRaj1992
Time Complexity: O(N), as we are using a loop to traverse N times so it will cost us O(N) time.
Auxiliary Space: O(N), as we are using extra space for DP.
Efficient approach : Space Optimization O(1)
To optimize the space complexity in previous code we are only using the previous row of the dp table to compute the values of the current row. Therefore, we can maintain just two variables to keep track of the values of the previous row instead of using a 2D vector. This will reduce the space complexity from O(N) to O(1).
Implementation Steps:
- Initialize two variables prev0 and prev1 to 0 and -999999 respectively.
- Loop through the input array from index 0 to n-1.
- Compute two new variables curr0 and curr1 as follows.
- curr0 is the maximum of (prev0 + a[i]) and (prev1 - a[i])
- curr1 is the maximum of (prev0 - a[i]) and (prev1 + a[i])
- Update prev0 to curr0 and prev1 to curr1 for further iteration.
- At last return final answer stored in prev0.
Implementation:
C++
// C++ code for above approach
#include <bits/stdc++.h>
using namespace std;
// Function to return the maximum possible
// sum after performing the given operation
int max_sum(int a[], int n)
{
// Variables to store the values of the
// previous row of the DP table
int prev0 = 0, prev1 = -999999;
for (int i = 0; i <= n - 1; i++) {
int curr0 = max(prev0 + a[i], prev1 - a[i]);
int curr1 = max(prev0 - a[i], prev1 + a[i]);
// assigning values for further iterations
prev0 = curr0;
prev1 = curr1;
}
// Return the maximum sum
return prev0;
}
// Driver code
int main()
{
int a[] = { -10, 5, -4 };
int n = sizeof(a) / sizeof(a[0]);
cout << max_sum(a, n);
return 0;
}
Java
// Java code for above approach
import java.util.*;
class Main {
// Function to return the maximum possible
// sum after performing the given operation
static int maxSum(int[] a, int n)
{
// Variables to store the values of the
// previous row of the DP table
int prev0 = 0, prev1 = -999999;
for (int i = 0; i <= n - 1; i++) {
int curr0 = Math.max(prev0 + a[i], prev1 - a[i]);
int curr1 = Math.max(prev0 - a[i], prev1 + a[i]);
// assigning values for further iterations
prev0 = curr0;
prev1 = curr1;
}
// Return the maximum sum
return prev0;
}
// Driver code
public static void main(String[] args)
{
int[] a = { -10, 5, -4 };
int n = a.length;
System.out.println(maxSum(a, n));
}
}
Python3
# Function to return the maximum possible sum after performing the given operation
def max_sum(a, n):
# Variables to store the values of the previous row of the DP table
prev0 = 0
prev1 = -999999
for i in range(n):
curr0 = max(prev0 + a[i], prev1 - a[i])
curr1 = max(prev0 - a[i], prev1 + a[i])
# assigning values for further iterations
prev0 = curr0
prev1 = curr1
# Return the maximum sum
return prev0
# Driver code
a = [-10, 5, -4]
n = len(a)
print(max_sum(a, n))
C#
using System;
class MainClass
{
// Function to return the maximum possible
// sum after performing the given operation
static int maxSum(int[] a, int n)
{
// Variables to store the values of the
// previous row of the DP table
int prev0 = 0, prev1 = -999999;
for (int i = 0; i <= n - 1; i++)
{
int curr0 = Math.Max(prev0 + a[i], prev1 - a[i]);
int curr1 = Math.Max(prev0 - a[i], prev1 + a[i]);
// assigning values for further iterations
prev0 = curr0;
prev1 = curr1;
}
// Return the maximum sum
return prev0;
}
// Driver code
public static void Main()
{
int[] a = { -10, 5, -4 };
int n = a.Length;
Console.WriteLine(maxSum(a, n));
}
}
JavaScript
// Function to return the maximum possible
// sum after performing the given operation
function max_sum(a, n) {
// Variables to store the values of the
// previous row of the DP table
let prev0 = 0,
prev1 = -999999;
for (let i = 0; i <= n - 1; i++) {
let curr0 = Math.max(prev0 + a[i], prev1 - a[i]);
let curr1 = Math.max(prev0 - a[i], prev1 + a[i]);
// assigning values for further iterations
prev0 = curr0;
prev1 = curr1;
}
// Return the maximum sum
return prev0;
}
// Driver code
let a = [-10, 5, -4];
let n = a.length;
console.log(max_sum(a, n));
Time Complexity: O(N), as we are using a loop to traverse N times so it will cost us O(N) time.
Auxiliary Space: O(1)
Similar Reads
Maximum possible Array sum after performing given operations
Given array arr[] of positive integers, an integer Q, and arrays X[] and Y[] of size Q. For each element in arrays X[] and Y[], we can perform the below operations: For each query from array X[] and Y[], select at most X[i] elements from array arr[] and replace all the selected elements with integer
9 min read
Maximum score possible after performing given operations on an Array
Given an array A of size N, the task is to find the maximum score possible of this array. The score of an array is calculated by performing the following operations on the array N times: If the operation is odd-numbered, the score is incremented by the sum of all elements of the current array. If th
15+ min read
Maximum Possible Product in Array after performing given Operations
Given an array with size N. You are allowed to perform two types of operations on the given array as described below: Choose some position i and j, such that (i is not equals to j), replace the value of a[j] with a[i]*a[j] and remove the number from the ith cell.Choose some position i and remove the
13 min read
Minimum possible sum of array elements after performing the given operation
Given an array arr[] of size N and a number X. If any sub array of the array(possibly empty) arr[i], arr[i+1], ... can be replaced with arr[i]/x, arr[i+1]/x, .... The task is to find the minimum possible sum of the array which can be obtained. Note: The given operation can only be performed once.Exa
9 min read
Maximum sum of all elements of array after performing given operations
Given an array of integers. The task is to find the maximum sum of all the elements of the array after performing the given two operations once each. The operations are: 1. Select some(possibly none) continuous elements from the beginning of the array and multiply by -1. 2. Select some(possibly none
7 min read
Find the Maximum sum of the Array by performing the given operations
Given an Array A[] of size N with repeated elements and all array elements are positive, the task is to find the maximum sum by applying the given operations: Select any 2 indexes and select 2 integers(say x and y) such that the product of the elements(x and y) is equal to the product of the element
5 min read
Maximum possible sum after M operations on N cards
Given an array arr[] of size N which represents the initial number on each card and given a two dimensional array B[][] of size M where M represents the number of operations that need to be performed. At each operation, choose at most B[j][0] cards (possibly zero) and replace the integer written on
8 min read
Reconstructing the Array with Maximum Possible Sum by Given Operations
Consider an array A[] of length N. Suppose, you can create obtain B[] from A[] using below steps: Iterate N/2 times on A and follow below the step below:Insert (Ai + Ai+(N/2)) and |Ai - Ai+(N/2)| into B[]After that rearrange B[] in any random order.You are given B[], the task is to reconstructing an
12 min read
Maximum Prefix Sum possible by merging two given arrays
Given two arrays A[] and B[] consisting of N and M integers respectively, the task is to calculate the maximum prefix sum that can be obtained by merging the two arrays. Examples: Input : A[] = {2, -1, 4, -5}, B[]={4, -3, 12, 4, -3}Output : 22Explanation: Merging the two arrays to generate the seque
11 min read
Maximum value in an array after m range increment operations
Consider an array of size n with all initial values as 0. We need to perform the following m range increment operations.increment(a, b, k) : Increment values from 'a' to 'b' by 'k'. After m operations, we need to calculate the maximum of the values in the array.Examples:Input : n = 5 m = 3 a = 0, b
10 min read