问题:给定两个有限的,严格增加的整数序列。两个序列之间的任何公共整数都构成一个交点;您必须找到一条在您走过的路径上产生最大元素总和的路径。
您可以通过以下方式“遍历”这两个序列:
您可以从两个序列中的任何一个开始。现在开始前进。
在每个交叉点,您可以选择继续使用当前正在使用的相同序列,或切换到其他序列。
示例
Input: A1[] = 1 2 7 11 14 25 A2[] = 1 4 7 9 12 25 30Output : The largest possible sum = 92
想法:我们将维护三个变量path1,path2和pathum。在任何时候,path1都是我们到目前为止所走过的最大数据总和,位于序列1上。path2是我们直到现在为止所走过的最大数据量,位于序列2上。最终结果存储在变量pathum中,通过是path1和path2的最大值。
在处理序列时,我们将路径1和路径2中的序列1和序列2的所有元素求和,直到到达任何相交点。到达任何相交点后,我们应将path1或path2中的较大者添加到pathum中,并重置path1 = path2 = 0,然后进一步开始处理序列。在我们结束任何序列的情况下,我们应该将下一个序列的所有剩余元素添加到其对应的路径中,最后检查两个路径中较大的一个,并将较大的路径添加到pathum中。

#include<bits/stdc++.h>
using namespace std;
//计算最大和的函数
int maxSumDHelix(int A1[], int A2[], int n1, int n2)
{
int i, j = 0, path1 = 0, path2 = 0, pathsum = 0;
//n1,n2是两个序列的长度
for(i=0; i<n2; i++)
{
//将元素添加到path2-
path2 += A2[i];
//将元素添加到pat1-
while(j<n1 && A1[j] < A2[i])
{
path1 += A1[j];
j++;
}
//在交叉点更新
//path1 path2和pathum-
if(j<n1 && A1[j]==A2[i])
{
path1 += A1[j];
pathsum += max(path1, path2);
//重置
path1 = 0;
path2 = 0;
j++;
}
}
// if n1 &gt; n2
while(j<n1)
{
path1 += A1[j];
j++;
}
//最终结果
pathsum += max(path1, path2);
return pathsum;
}
//驱动程序
int main(){
int n1,n2;
cout<<"Enter size of 1st array :";
cin>>n1;
int A1[n1];
cout<<"\nEnter elements of 1st array:\n";
for(int i=0;i<n1;i++)
cin>>A1[i];
cout<<"Enter size of 2nd array:";
cin>>n2;
int A2[n2];
cout<<"\nEnter elements of 2nd array:\n";
for(int i=0;i<n2;i++)
cin>>A2[i];
cout << "The largest possible sum = " << maxSumDHelix(A1, A2, n1, n2);
return 0;
}输出结果
Enter size of 1st array :6 Enter elements of 1st array: 1 2 7 11 14 25 Enter size of 2nd array:7 Enter elements of 2nd array: 1 4 7 9 12 25 30 The largest possible sum = 92