C++中从三个数组中获取最大和,但不能连续选择来自同一数组的元素
在这个问题中,我们得到三个大小为N的数组arr1[]、arr2[]和arr3[]。我们的任务是编写一个C++程序来查找这三个数组中的最大和,条件是不能连续选择来自同一数组的元素。
问题描述
我们将通过选择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<<"The maximum sum from three arrays such that picking elements consecutively from same is not allowed is "<<findMaxVal(val1, findMaxVal(val2, val3)); return 0; }
输出
The maximum sum from three arrays such that picking elements consecutively from same is not allowed is 50
广告