📌  相关文章
📜  给定一个数组和三个数字,最大化 (x * a[i]) + (y * a[j]) + (z * a[k])

📅  最后修改于: 2022-05-13 01:57:48.952000             🧑  作者: Mango

给定一个数组和三个数字,最大化 (x * a[i]) + (y * a[j]) + (z * a[k])

给定一个包含 n 个整数的数组,以及三个整数 x、y 和 z。最大化 (x * a[i]) + (y * a[j]) + (z * a[k]) 的值,其中 i ≤ j ≤ k。

例子 :

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

一个简单的解决方案是运行三个嵌套循环来遍历所有三元组。对于每个三元组,计算所需的值并跟踪最大值并最终返回相同的值。

一个有效的解决方案是预先计算值并使用额外的空间存储它们。第一个关键观察结果是 i ≤ j ≤ k,因此 x*a[i] 将始终是左侧最大值,而 z*a[k] 将始终是右侧最大值。创建一个左数组,我们在其中存储每个元素的左最大值。创建一个正确的数组,我们在其中存储每个元素的正确最大值。然后对于每个元素,计算可能的函数的最大值。对于任何索引 ind,该位置的最大值始终为 (left[ind] + j * a[ind] + right[ind]),找到数组中每个元素的最大值,这就是你的答案.

下面是上述方法的实现

C++
// CPP program to find the maximum value of
// x*arr[i] + y*arr[j] + z*arr[k]
#include 
using namespace std;
 
// function to maximize the condition
int maximizeExpr(int a[], int n, int x, int y,
                                        int z)
{
    // Traverse the whole array and compute
    // left maximum for every index.
    int L[n];
    L[0] = x * a[0];
    for (int i = 1; i < n; i++)
        L[i] = max(L[i - 1], x * a[i]);
 
    // Compute right maximum for every index.
    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]);
 
    // Traverse through the whole array to
    // maximize the required expression.
    int ans = INT_MIN;
    for (int i = 0; i < n; i++)
          ans = max(ans, L[i] + y * a[i] + R[i]);
 
    return ans;
}
     
// driver program to test the above function
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
// Java program to find the maximum value
// of x*arr[i] + y*arr[j] + z*arr[k]
import java.io.*;
 
class GFG {
 
    // function to maximize the condition
    static int maximizeExpr(int a[], int n, int x,
                             int y, int z)
    {
        // Traverse the whole array and compute
        // left maximum for every index.
        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]);
 
        // Compute right maximum for every index.
        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]);
 
        // Traverse through the whole array to
        // maximize the required expression.
        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;
    }
     
    // driver program to test the above function
    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));
    }
}
// This code is contributed by Prerna Saini


Python3
# Python3 program to find
# the maximum value of
# x*arr[i] + y*arr[j] + z*arr[k]
import sys
 
# function to maximize
# the condition
def maximizeExpr(a, n, x, y, z):
 
    # Traverse the whole array
    # and compute left maximum
    # for every index.
    L = [0] * n
    L[0] = x * a[0]
    for i in range(1, n):
        L[i] = max(L[i - 1], x * a[i])
 
    # Compute right maximum
    # for every index.
    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])
 
    # Traverse through the whole
    # array to maximize the
    # required expression.
    ans = -sys.maxsize
    for i in range(0, n):
        ans = max(ans, L[i] + y *
                       a[i] + R[i])
 
    return ans
 
# Driver Code
a = [-1, -2, -3, -4, -5]
n = len(a)
x = 1
y = 2
z = -3
print(maximizeExpr(a, n, x, y, z))
 
# This code is contributed
# by Smitha


C#
// C# program to find the maximum value
// of x*arr[i] + y*arr[j] + z*arr[k]
using System;
 
class GFG {
 
    // function to maximize the condition
    static int maximizeExpr(int []a, int n,
                       int x, int y, int z)
    {
         
        // Traverse the whole array and
        // compute left maximum for every
        // index.
        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]);
 
        // Compute right maximum for
        // every index.
        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]);
 
        // Traverse through the whole array to
        // maximize the required expression.
        int ans = int.MinValue;
        for (int i = 0; i < n; i++)
            ans = Math.Max(ans, L[i] +
                             y * a[i] + R[i]);
 
        return ans;
    }
     
    // driver program to test the
    // above function
    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));
    }
}
 
// This code is contributed by vt_m.


PHP
= 0; $i--)
        $R[$i] = max($R[$i + 1],
                     $z * $a[$i]);
 
    // Traverse through the whole
    // array to maximize the
    // required expression.
    $ans = PHP_INT_MIN;
    for ($i = 0; $i < $n; $i++)
        $ans = max($ans, $L[$i] +
                   $y * $a[$i] + $R[$i]);
 
    return $ans;
}
     
// Driver Code
$a = array(-1, -2, -3, -4, -5);
$n = count($a);
$x = 1; $y = 2 ; $z = -3;
echo maximizeExpr($a, $n, $x, $y, $z);
 
// This code is contributed by anuj_67.
?>


Javascript


输出 :

12

时间复杂度: O(n)
辅助空间: O(n)