两个排序数组中的最大总和路径

时间:2017-05-21 18:57:17

标签: arrays algorithm

我正试图解决geeksforgeeks-的问题 - http://practice.geeksforgeeks.org/problems/max-sum-path-in-two-arrays/1

给定两个数组,任务是找到从任何数组的开始到任何数组的结尾的最大和路径。我们只能在公共点从一个数组切换到另一个数组。

让两个数组分别为A和B,大小为M和N.

路径从任何数组(A或B)的开始开始,到任何数组(A或B)结束。 对于非公共点,路径在当前阵列的正确方向上继续,并且我们可以仅在公共点处切换阵列。因此,在这些共同点上,我们有两个方向可以遵循。

e.g。

阵列A是2,3,7,10,12。 数组B是1,5,7,8。

我们可以从。 2 - > 3 - > 7 - > 10 - > 12。 要么。 2 - > 3 - > 7 - > 8。 我们也可以从。 1 - > 5 - > 7 - > 8。 要么。 1 - > 5 - > 7 - > 10 - > 12。

在寻找解决方案时,我找到了解决方案: http://www.geeksforgeeks.org/maximum-sum-path-across-two-arrays/

我已对自己做过一些调查,我认为解决方案不正确。如果数组中有多个公共点,它将失败。

如果解决方案正确或给我一个有效的解决方案,请帮助我理解解决方案。

我的理解:我认为如果我们尝试用图表来理解它,这就是在DAG中找到最大路径的问题。如果我没有错,我们可以设计一个动态的编程方案。我无法做到这一点。

编辑:我的理解是,如果我们有重复的共同点,它将会失败。例如。 A:2,3,6,6,8,10,13,14。 B:1,5,6,9,10,12,14

1 个答案:

答案 0 :(得分:0)

这个算法没问题。

首先,假设没有多个重复点。两个阵列共有k个点。因此,该算法将两个数组沿共同点分成k + 1个不同的部分。例如,5和10在以下数组中很常见:

a = [0,2,5,7,10,11]
b = [1,3,5,6,10,12]

因此,数组分为3部分:

a变为[0,2],[7],[11]

b变为[1,3],[6],[12]

然后选择所有k + 1个部分中较大的两个部分(这里[1,3]选自b。[7]来自a和[12]来自b)并将它们全部添加到结果中。 = 4 + 7 + 12 = 23)

然后简单地将所有共同点添加到最终结果中。(res = 23 + 5 + 10 = 38)

该算法通过简单地将两个数组中的重复值合并在一起来解决重复问题。因此,如果两个阵列中有三个'5'而不是一个,则只考虑两个阵列中的单个15。如果在a中有三个'5'但在b中有两个,它将以与[10,5]和[10]相同的方式处理它们,因此a中的最后'5'不被视为共同点。