Maximize the Sum of Array by Multiplying Prefix with 1 in C++



We are given an integer array and the task is to firstly fetch the prefix of an array and then multiply it with -1, secondly calculate the prefix sum of an array and lastly find the maximum sum from the prefix array generated.

Prefix array is generated as −

First element of prefixArray[0] = first element of an array

Second element of prefixArray[1] = prefixArray[0] + arr[1]

Third element of prefixArray[2] = prefixArray[1] + arr[2]

Fourth element of prefixArray[3] = prefixArray[2] + arr[3] …..etc.

Let us see various input output scenarios for this -

In  int arr[] = {2, 4, 1, 5, 2}

Out − Prefix array is: -2 2 3 8 10 Maximize the sum of array by multiplying prefix of array with -1 are: 21

Explanation − we are given with an integer array. So we will firstly fetch the prefix of an array which is 2 and multiple it with -1. So, the new array will be {-2, 4, 1, 5, 2}. Now, we will form the prefix array which is {-2, 2, 3, 8, 10}. The last step is to maximize the sum as -2+2+3+8+`0 = 21 which is the final output.

In − int arr[] = {-1, 4, 2, 1, -9, 6};

Out − Prefix array is: 1 5 7 8 -1 5 Maximize the sum of array by multiplying prefix of array with -1 are: 19

Explanation − we are given with an integer array. So we will firstly fetch the prefix of an array which is -1 and multiple it with -1. So, the new array will be {1, 4, 2, 1, -9, 6}. Now, we will form the prefix array which is {1, 5, 7, 8, -1, 5}. The last step is to maximize the sum as 1+5+8+5 = 19 which is the final output.

Approach used in the below program is as follows −

  • Declare an integer array and a temporary variable as x to -1 then set arr[0] to arr[0] * x.

  • Calculate the size of an array. Declare a prefix array as prefix_arry[size]. Call a function create_prefix_arr(arr, size, prefix_array) to generate the prefix array from the given array. Print the prefix array

  • Call the function maximize_sum(prefix_array, size) that will store the maximum sum of the array.

  • Inside the function void create_prefix_arr(int arr[], int size, int prefix_array[])

    • Set prefix_array[0] to arr[0].

    • Start loop FOR from i to 0 till the size of an array. Inside the loop, set prefix_array[i] to prefix_array[i-1] + arr[i].

  • Inside the function int maximize_sum(int prefix_array[], int size)

    • Declare a temporary variable as temp and set it to -1.

    • Start loop FOR from i to 0 till the size of an array. Inside the loop, set temp as max(temp, prefix_array[i])

    • Declare an array as arr[temp +1] and initialise all the elements of an array with 0.

    • Start loop FOR from i to 0 till the size of an array. Inside the loop, set arr[prefix_array[i]]++

    • Declare a temporary variable as max_sum and set it to 0. Declare a variable as int i to temp

    • Start loop WHILE i>0. Check IF arr[i] > 0 then set max_sum to max_sum + i and decrement the arr[i-1]-- and decrement the arr[i]--. ELSE, decrement the i by 1.

    • Return max_sum.

Example

#include <bits/stdc++.h> using namespace std; #define Max_size 5 //create the prefix array void create_prefix_arr(int arr[], int size, int prefix_array[]) {    prefix_array[0] = arr[0];    for(int i=0; i<size; i++)  {       prefix_array[i] = prefix_array[i-1] + arr[i];    } } //find the maximum sum of prefix array int maximize_sum(int prefix_array[], int size) {    int temp = -1;    for(int i = 0; i < size; i++) {       temp = max(temp, prefix_array[i]);    }    int arr[temp + 1];    memset(arr, 0, sizeof(arr));    for(int i = 0; i < size; i++) {       arr[prefix_array[i]]++;    }    int max_sum = 0;    int i = temp;    while(i>0) {       if(arr[i] > 0) {          max_sum = max_sum + i;          arr[i-1]--;          arr[i]--;       } else {          i--;       }    }    return max_sum; } int main() {    int arr[] = {2, 4, 1, 5, 2};       int x = -1;       arr[0] = arr[0] * x;       int size = sizeof(arr) / sizeof(arr[0]);    int prefix_array[size];    //call function to create a prefix array    create_prefix_arr(arr, size, prefix_array);    //print the prefix array    cout<<"Prefix array is: ";    for(int i = 0; i < size; i++) {       cout << prefix_array[i] << " ";    }    //print the maximum sum of prefix array    cout<<"\nMaximize the sum of array by multiplying prefix of array with -1 are:" <<maximize_sum(prefix_array, size);    return 0; }

Output

If we run the above code it will generate the following Output

Prefix array is: -2 2 3 8 10 Maximize the sum of array by multiplying prefix of array with -1 are: 21
Updated on: 2021-10-22T07:30:50+05:30

262 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements
close