在 C++ 中,求三个数组的最大和,且不允许从相同的元素连续取值

c++server side programmingprogramming

在这个问题中,我们给出了三个大小均为 N 的数组 arr1[]、arr2[] 和 arr3[]。我们的任务是编写一个程序,求三个数组的最大和,且不允许从相同的元素连续取值。

问题描述

我们将通过选择 N 个元素来求出最大和。第 i 个元素可以从数组的第 i 个元素中选择,即第 i 个和来自 arr1[i]/ arr2[i]/ arr3[i]。另外,请记住,我们不能从同一个数组中选择两个连续的元素。

让我们举个例子来理解这个问题:

输入输出

arr1[] = {5, 8, 9, 20},
arr2[] = {7, 12, 1, 10},
arr3[] = {8, 9, 10, 11}
N = 4

输出

50

解释

对于 i = 1,我们将考虑将 arr3 中的元素 8 作为和。对于 i = 2,我们将考虑将 arr2 中的元素 12 作为和。对于 i = 3,我们将考虑将 arr3 中的元素 10 作为和。对于 i = 4 的情况,我们考虑将 arr1 中的和设为 20。和 = 8 + 12 + 10 + 20 = 50

解决方法

为了解决这个问题,我们将使用动态规划方法,同时需要记住直到索引处的和,以避免额外的计算。我们将创建一个二维矩阵 DP[][]。索引 i,j 处的元素将是直到第 i 个索引处元素和第 j 个数组的和。我们将递归地查找当前元素,然后调用其他两个数组中下一个元素的和。

示例

编写程序来说明我们的解决方案的工作原理

#include <bits/stdc++.h>
using namespace std;
const int N = 3;
int findMaxVal(int a, int b){
   if(a > b)
      return a;
      return b;
}
int FindMaximumSum(int index, int arrNo, int arr1[], int arr2[], int arr3[], int n, int DP[][N]){
   if (index == n)
      return 0;
   if (DP[index][arrNo] != -1)
      return DP[index][arrNo];
      int maxVal = -1;
   if (arrNo == 0){
      maxVal = findMaxVal(maxVal, arr2[index] + FindMaximumSum(index + 1, 1, arr1, arr2, arr3, n, DP));
      maxVal = findMaxVal(maxVal, arr3[index] + FindMaximumSum(index + 1, 2, arr1, arr2, arr3, n, DP));
   }
   else if (arrNo == 1){
      maxVal = findMaxVal(maxVal, arr1[index] + FindMaximumSum(index + 1, 0, arr1, arr2, arr3, n, DP));
      maxVal = findMaxVal(maxVal, arr3[index] + FindMaximumSum(index + 1, 2, arr1, arr2, arr3, n, DP));
   }
   else if (arrNo == 2){
      maxVal = findMaxVal(maxVal, arr1[index] + FindMaximumSum(index + 1, 1, arr1, arr2, arr3, n, DP));
      maxVal = findMaxVal(maxVal, arr2[index] + FindMaximumSum(index + 1, 0, arr1, arr2, arr3, n, DP));
   }
   return DP[index][arrNo] = maxVal;
}
int main(){
   int arr1[] = { 5, 8, 9, 20 };
   int arr2[] = { 7, 12, 1, 10 };
   int arr3[] = { 8, 9, 10, 11 };
   int n = sizeof(arr1) / sizeof(arr1[0]);
   int DP[n][N];
   memset(DP, -1, sizeof DP);
   int val1 = FindMaximumSum(0, 0, arr1, arr2, arr3, n, DP);
   int val2 = FindMaximumSum(0, 1, arr1, arr2, arr3, n, DP);
   int val3 = FindMaximumSum(0, 2, arr1, arr2, arr3, n, DP);
   cout<<"三个数组的最大和,使得不允许从同一个数组中连续选取元素,是 "<<findMaxVal(val1, findMaxVal(val2, val3));
   return 0;
}

输出

三个数组的最大和,使得不允许从同一个数组中连续选取元素,是 50

相关文章