Open In App

Maximize Array sum by replacing middle elements with min of Subarray corners

Given an array A[] of length N. Then your task is to output the maximum sum that can be achieved by using the given operation at any number of times (possibly zero):

Examples:



Input: N = 3, A[] = {8, 1, 7}
Output: 22
Explanation: Let us take the subarray A[1, 3] = {8, 1, 7}. Middle element(s) are: {1}. Now minimum of A[1] and A[3] is = min(A[1], A[3]) = min(8, 7) = 7. Then, we replaced all the middle elements equal to min according to the operation. So, updated A[] = {8, 7, 7}. The sum of updated A[] = 22. Which is the maximum possible using a given operation. Therefore, output is 22.

Input: N = 2, A[] = {5, 2}
Output: 7
Explanation: No subarray of length at least 3 can be chosen, Thus can’t apply any operation. So the maximum possible sum is 7.



Approach: Implement the idea below to solve the problem

The problem is based on the observations and can be solved using the Prefix and Suffix arrays. It must be noticed that for any index i, we can not make the element A[i] to be anything more than the minimum of the greatest element to its left and the greatest element to its right.

Steps were taken to solve the problem:

Code to implement the approach:




//code by FLutterfly
#include <iostream>
#include <algorithm>
 
using namespace std;
 
// Function prototype
void Max_sum(int N, int A[]);
 
int main()
{
    // Input
    int N = 2;
    int A[] = {5, 2};
 
    // Function call
    Max_sum(N, A);
 
    return 0;
}
 
void Max_sum(int N, int A[])
{
    // Prefix and Suffix Arrays
    int prefix[N];
    int suffix[N];
 
    // Initializing prefix array
    prefix[0] = A[0];
    for (int i = 1; i < N; i++)
    {
        prefix[i] = max(prefix[i - 1], A[i]);
    }
 
    // Initializing suffix array
    suffix[N - 1] = A[N - 1];
    for (int i = N - 2; i >= 0; i--)
    {
        suffix[i] = max(suffix[i + 1], A[i]);
    }
 
    // Variable to store max sum
    long long sum = 0;
 
    // Calculating sum for all middle elements
    for (int i = 1; i < N - 1; i++)
    {
        int maxi1 = prefix[i], maxi2 = suffix[i];
        sum += min(maxi1, maxi2);
    }
 
    // Adding last elements of both ends into sum
    sum += A[0] + A[N - 1];
 
    // Printing the value of sum
    cout << sum << endl;
}




// Java code to implement the approach
import java.util.*;
 
class Main {
    public static void main(String[] args)
    {
        // Input
        int N = 2;
        int A[] = { 5, 2 };
 
        // Function call
        Max_sum(N, A);
    }
    public static void Max_sum(int N, int[] A)
    {
        // Prefix and Suffix Arrays
        int[] prefix = new int[N];
        int[] suffix = new int[N];
 
        // Initializing prefix array
        prefix[0] = A[0];
        for (int i = 1; i < N; i++) {
            prefix[i] = Math.max(prefix[i - 1], A[i]);
        }
 
        // Initializing suffix array
        suffix[N - 1] = A[N - 1];
        for (int i = N - 2; i >= 0; i--) {
            suffix[i] = Math.max(suffix[i + 1], A[i]);
        }
 
        // Variable to store max sum
        long sum = 0;
 
        // Calculating sum for all middle elements
        for (int i = 1; i < N - 1; i++) {
            int maxi1 = prefix[i], maxi2 = suffix[i];
            sum += Math.min(maxi1, maxi2);
        }
 
        // Adding last elements of both ends into sum
        sum += A[0] + A[N - 1];
 
        // Printing the value of sum
        System.out.println(sum);
    }
}




# code by flutterfly
def Max_sum(N, A):
    # Prefix and Suffix Arrays
    prefix = [0] * N
    suffix = [0] * N
 
    # Initializing prefix array
    prefix[0] = A[0]
    for i in range(1, N):
        prefix[i] = max(prefix[i - 1], A[i])
 
    # Initializing suffix array
    suffix[N - 1] = A[N - 1]
    for i in range(N - 2, -1, -1):
        suffix[i] = max(suffix[i + 1], A[i])
 
    # Variable to store max sum
    sum_val = 0
 
    # Calculating sum for all middle elements
    for i in range(1, N - 1):
        maxi1, maxi2 = prefix[i], suffix[i]
        sum_val += min(maxi1, maxi2)
 
    # Adding last elements of both ends into sum
    sum_val += A[0] + A[N - 1]
 
    # Printing the value of sum
    print(sum_val)
 
# Input
N = 2
A = [5, 2]
 
# Function call
Max_sum(N, A)




//code by flutterfly
using System;
 
class Program
{
    static void Main()
    {
        // Input
        int N = 2;
        int[] A = { 5, 2 };
 
        // Function call
        Max_sum(N, A);
    }
 
    static void Max_sum(int N, int[] A)
    {
        // Prefix and Suffix Arrays
        int[] prefix = new int[N];
        int[] suffix = new int[N];
 
        // Initializing prefix array
        prefix[0] = A[0];
        for (int i = 1; i < N; i++)
        {
            prefix[i] = Math.Max(prefix[i - 1], A[i]);
        }
 
        // Initializing suffix array
        suffix[N - 1] = A[N - 1];
        for (int i = N - 2; i >= 0; i--)
        {
            suffix[i] = Math.Max(suffix[i + 1], A[i]);
        }
 
        // Variable to store max sum
        long sum = 0;
 
        // Calculating sum for all middle elements
        for (int i = 1; i < N - 1; i++)
        {
            int maxi1 = prefix[i], maxi2 = suffix[i];
            sum += Math.Min(maxi1, maxi2);
        }
 
        // Adding last elements of both ends into sum
        sum += A[0] + A[N - 1];
 
        // Printing the value of sum
        Console.WriteLine(sum);
    }
}




function Max_sum(N, A) {
    // Prefix and Suffix Arrays
    let prefix = new Array(N);
    let suffix = new Array(N);
 
    // Initializing prefix array
    prefix[0] = A[0];
    for (let i = 1; i < N; i++) {
        prefix[i] = Math.max(prefix[i - 1], A[i]);
    }
 
    // Initializing suffix array
    suffix[N - 1] = A[N - 1];
    for (let i = N - 2; i >= 0; i--) {
        suffix[i] = Math.max(suffix[i + 1], A[i]);
    }
 
    // Variable to store max sum
    let sum = 0;
 
    // Calculating sum for all middle elements
    for (let i = 1; i < N - 1; i++) {
        let maxi1 = prefix[i], maxi2 = suffix[i];
        sum += Math.min(maxi1, maxi2);
    }
 
    // Adding last elements of both ends into sum
    sum += A[0] + A[N - 1];
 
    // Printing the value of sum
    console.log(sum);
}
 
// Input
let N = 2;
let A = [5, 2];
 
// Function call
Max_sum(N, A);

Output
7





Time Complexity: O(N)
Auxiliary Space: O(2*N), As Prefix and Suffix arrays of length N are used.


Article Tags :