两个列表的乘积的最大和

时间:2019-05-09 16:30:22

标签: python algorithm recursion dynamic-programming

我需要编写一种基于动态编程方法的算法,说实话,我完全陷入了困境。

好,所以问题就是这样。我有两个长度相同(偶数)的列表。例如,假设:

a = [43, 10, 40, 12]
b = [63, 73, 5,  13]

我需要使用动态编程方法从这些列表中找到配对数乘积的最大和。数字只能以以下方式配对:

(a[n] * a[n+1]) V (b[n] * b[n+1]) V (a[n] * b[n])

很明显,如果您选择了这些组合之一,就不能再使用这些数字了。

我实际上需要帮助的是为此找到递归函数。而且我真的找不到。如果有人可以帮助我,我将非常感激。

最诚挚的问候

1 个答案:

答案 0 :(得分:1)

这里的关键见解是匹配是耦合的。如果将a[i]a[i+1]匹配,则还必须将b[i]b[i+1]匹配。否则,将至少有一个不匹配的条目。因此,当您从左到右浏览列表时,只需决定是垂直匹配还是水平匹配。

要将其表述为动态程序,我们传播函数S(i),该函数记录可以使用元素0 .. i获得的最大分数。然后,递归关系为:

S(i) = max(
            S(i - 1) + a[i] * b[i],                        #vertical match
            S(i - 2) + a[i - 1] * a[i] + b[i - 1] * b[i])  #horizontal match

当然,要进行适当的边界处理。

相关问题