Given an array and three numbers, maximize (x * a[i]) + (y * a[j]) + (z * a[k])
Given an array of n integers, and three integers x, y and z. maximize the value of (x * a[i]) + (y * a[j]) + (z * a[k]) where i ? j ? k.
Examples :
Input : arr[] = {-1, -2, -3, -4, -5}
x = 1
y = 2
z = -3
Output: 12
Explanation: The maximized values is
(1 * -1) + (2 * -1) + ( -3 * -5) = 12
Input: arr[] = {1, 2, 3, 4, 5}
x = 1
y = 2
z = 3
Output: 30
(1*5 + 2*5 + 3*5) = 30
A simple solution is to run three nested loops to iterate through all triplets. For every triplet, compute the required value and keep track of maximum and finally return the same.
An efficient solution is to precompute values and stores them using extra space. The first key observation is i ? j ? k, so x*a[i] will always be the left maximum, and z*a[k] will always be the right maximum. Create a left array where we store the left maximums for every element. Create a right array where we store the right maximums for every element. Then for every element, calculate the maximum value of the function possible. For any index ind, the maximum at that position will always be (left[ind] + j * a[ind] + right[ind]), find the maximum of this value for every element in the array and that will be your answer.
Below is the implementation of the above approach
C++
#include <bits/stdc++.h>
using namespace std;
int maximizeExpr( int a[], int n, int x, int y,
int z)
{
int L[n];
L[0] = x * a[0];
for ( int i = 1; i < n; i++)
L[i] = max(L[i - 1], x * a[i]);
int R[n];
R[n-1] = z * a[n-1];
for ( int i = n - 2; i >= 0; i--)
R[i] = max(R[i + 1], z * a[i]);
int ans = INT_MIN;
for ( int i = 0; i < n; i++)
ans = max(ans, L[i] + y * a[i] + R[i]);
return ans;
}
int main()
{
int a[] = {-1, -2, -3, -4, -5};
int n = sizeof (a)/ sizeof (a[0]);
int x = 1, y = 2 , z = -3;
cout << maximizeExpr(a, n, x, y, z) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
static int maximizeExpr( int a[], int n, int x,
int y, int z)
{
int L[] = new int [n];
L[ 0 ] = x * a[ 0 ];
for ( int i = 1 ; i < n; i++)
L[i] = Math.max(L[i - 1 ], x * a[i]);
int R[] = new int [n];
R[n - 1 ] = z * a[n - 1 ];
for ( int i = n - 2 ; i >= 0 ; i--)
R[i] = Math.max(R[i + 1 ], z * a[i]);
int ans = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++)
ans = Math.max(ans, L[i] + y * a[i] +
R[i]);
return ans;
}
public static void main(String[] args)
{
int a[] = {- 1 , - 2 , - 3 , - 4 , - 5 };
int n = a.length;
int x = 1 , y = 2 , z = - 3 ;
System.out.println(maximizeExpr(a, n, x, y, z));
}
}
|
Python3
import sys
def maximizeExpr(a, n, x, y, z):
L = [ 0 ] * n
L[ 0 ] = x * a[ 0 ]
for i in range ( 1 , n):
L[i] = max (L[i - 1 ], x * a[i])
R = [ 0 ] * n
R[n - 1 ] = z * a[n - 1 ]
for i in range (n - 2 , - 1 , - 1 ):
R[i] = max (R[i + 1 ], z * a[i])
ans = - sys.maxsize
for i in range ( 0 , n):
ans = max (ans, L[i] + y *
a[i] + R[i])
return ans
a = [ - 1 , - 2 , - 3 , - 4 , - 5 ]
n = len (a)
x = 1
y = 2
z = - 3
print (maximizeExpr(a, n, x, y, z))
|
C#
using System;
class GFG {
static int maximizeExpr( int []a, int n,
int x, int y, int z)
{
int []L = new int [n];
L[0] = x * a[0];
for ( int i = 1; i < n; i++)
L[i] = Math.Max(L[i - 1], x * a[i]);
int []R = new int [n];
R[n - 1] = z * a[n - 1];
for ( int i = n - 2; i >= 0; i--)
R[i] = Math.Max(R[i + 1], z * a[i]);
int ans = int .MinValue;
for ( int i = 0; i < n; i++)
ans = Math.Max(ans, L[i] +
y * a[i] + R[i]);
return ans;
}
public static void Main()
{
int []a = {-1, -2, -3, -4, -5};
int n = a.Length;
int x = 1, y = 2 , z = -3;
Console.WriteLine(
maximizeExpr(a, n, x, y, z));
}
}
|
PHP
<?php
function maximizeExpr( $a , $n ,
$x , $y , $z )
{
$L = array ();
$L [0] = $x * $a [0];
for ( $i = 1; $i < $n ; $i ++)
$L [ $i ] = max( $L [ $i - 1],
$x * $a [ $i ]);
$R = array ();
$R [ $n - 1] = $z * $a [ $n - 1];
for ( $i = $n - 2; $i >= 0; $i --)
$R [ $i ] = max( $R [ $i + 1],
$z * $a [ $i ]);
$ans = PHP_INT_MIN;
for ( $i = 0; $i < $n ; $i ++)
$ans = max( $ans , $L [ $i ] +
$y * $a [ $i ] + $R [ $i ]);
return $ans ;
}
$a = array (-1, -2, -3, -4, -5);
$n = count ( $a );
$x = 1; $y = 2 ; $z = -3;
echo maximizeExpr( $a , $n , $x , $y , $z );
?>
|
Javascript
<script>
function maximizeExpr(a , n , x , y , z)
{
var L = Array(n).fill(0);
L[0] = x * a[0];
for (i = 1; i < n; i++)
L[i] = Math.max(L[i - 1], x * a[i]);
var R = Array(n).fill(0);
R[n - 1] = z * a[n - 1];
for (i = n - 2; i >= 0; i--)
R[i] = Math.max(R[i + 1], z * a[i]);
var ans = Number.MIN_VALUE;
for (i = 0; i < n; i++)
ans = Math.max(ans, L[i] + y * a[i] + R[i]);
return ans;
}
var a = [ -1, -2, -3, -4, -5 ];
var n = a.length;
var x = 1, y = 2, z = -3;
document.write(maximizeExpr(a, n, x, y, z));
</script>
|
Time complexity: O(n)
Auxiliary Space: O(n)
Last Updated :
18 Sep, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...