在C++中,乘以任何子数组的所有元素后最大化子数组和


给定一个整数数组和一个整数变量‘X’。任务是首先从给定数组中形成子数组,然后将子数组的所有元素乘以整数X。最后找出贡献最大和的元素。

让我们看看各种输入输出场景 -

输入 − int arr[] = {2, 4, 1, -5, -2}, X = 3

输出 − 乘以任何子数组的所有元素后最大化子数组和的结果是:21

解释 − 给定一个数组和一个整数变量X。首先,从给定数组中获取子数组,例如{2, 4, 1}。现在将子数组的所有元素乘以X,即3,所以数组将变为{6, 12, 3, -5, -2}。最后,检查最大子数组和,它将返回6 + 12 + 3 = 21。

输入 − int arr[] = {-1, 2, -6, 3, -4}, x= -1

输出 − 乘以任何子数组的所有元素后最大化子数组和的结果是:11

解释 − 给定一个数组和一个整数变量X。首先,从给定数组中获取子数组,例如{-1, -6, -4}。现在将子数组的所有元素乘以X,即-1,所以数组将变为{1, 2, 6, 3, 4}。最后,检查最大子数组和,它将返回1 + 6 + 4 = 11。

下面程序中使用的方案如下

  • 输入一个整数数组和一个整数变量作为‘X’。计算数组的大小并将数据传递给函数Max_Subarray(arr, size, x)。

  • 在函数Max_Subarray(arr, size, x)内部

    • 声明一个数组为int arr_2[size][3]和一个临时变量temp为0。

    • 使用C++中的memset()方法将数组‘arr_2’的所有元素初始化为-1。

    • 从i=0开始循环到数组大小。在循环内,将temp设置为对函数max(temp, check(i, 0, arr, arr_2, size, x))的调用的结果。

    • 返回temp。

  • 在函数int check(int first, int last, int arr[], int arr_2[Max_size][3], int size, int x)内部

    • 声明一个临时变量count为0。

    • 检查IF first = size,则返回0

    • 检查IF arr_2[first][last] != -1,则返回arr_2[first][last]。

    • 检查IF last = 0,则调用C++的内置max函数找出最大值,max(count, arr[first] + check(first + 1, 0, arr, arr_2, size, x)),并将count设置为max(count, x * arr[first] + check(first + 1, 1, arr, arr_2, size, x))

    • ELSE IF last = 1,则将count设置为max(count, x * arr[first] + check(first + 1, 1, arr, arr_2, size, x)),并将count设置为max(count, arr[first] + check(first + 1, 2, arr, arr_2, size, x))

    • ELSE,将count设置为max(count, arr[first] + check(first + 1, 2, arr, arr_2, size, x));

    • 将arr_2[first][last]返回到count。

  • 打印结果。

示例

#include <bits/stdc++.h>
using namespace std;
#define Max_size 5

int check(int first, int last, int arr[], int arr_2[Max_size][3], int size, int x){
   int count = 0;
      if(first == size){
         return 0;
      }
      if(arr_2[first][last] != -1){
         return arr_2[first][last];}
      if (last == 0){
         count = max(count, arr[first] + check(first + 1, 0, arr, arr_2, size, x));
         count = max(count, x * arr[first] + check(first + 1, 1, arr, arr_2, size, x));
      }
      else if(last == 1){
         count = max(count, x * arr[first] + check(first + 1, 1, arr, arr_2, size, x));
         count = max(count, arr[first] + check(first + 1, 2, arr, arr_2, size, x));
      }
      else{
         count = max(count, arr[first] + check(first + 1, 2, arr, arr_2, size, x));
      }
      return arr_2[first][last] = count;
}
int Max_Subarray(int arr[], int size, int x){
   int arr_2[size][3];
   int temp = 0;
   memset(arr_2, -1, sizeof arr_2);
   for(int i = 0; i < size; i++){
      temp = max(temp, check(i, 0, arr, arr_2, size, x));
   }
   return temp;
}
int main(){
   int arr[] = {2, 4, 1, -5, -2};
   int size = sizeof(arr) / sizeof(arr[0]);
   int x = 3;
   cout<<"Maximize the subarray sum after multiplying all elements of any subarray with X are: "<<Max_Subarray(arr, size, x);
   return 0;
}

输出

如果运行以上代码,它将生成以下输出

Maximize the subarray sum after multiplying all elements of any subarray with X are: 21

更新于:2021年10月22日

214 次查看

启动您的职业生涯

完成课程获得认证

开始学习
广告