在 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