python - 两个列表的最大乘积和

标签 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])

显然,如果您选择了其中一种组合,您将无法再使用这些数字。

我真正需要帮助的是找到它的递归函数。而我真的找不到。如果有人能帮助我,我将不胜感激。

最好的问候

最佳答案

这里的关键见解是匹配是耦合的。如果你将 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

当然,有适当的边界处理。

关于python - 两个列表的最大乘积和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56063858/

相关文章:

java - 如何修复: Sudoku solver Stack overflow problem

C - 如何跟踪这个递归?

python - 使用 subgraph() 并通过 igraph python 保留顶点属性

python - 带有多个参数的 SQLAlchemy "or"语句

python - 为什么 ,,b = 1,2,3 在 IPython 中被解析为 (',b' , '=' , '1,2,3' )?

algorithm - 以 (x * y) 的降序枚举 2D 平面上的网格点

iphone - 在 sqlite 中递归进行递归计算的替代方案?

python - Heroku 上的 Django 应用 : Application Error

java - Math.abs(a - b) - Math.abs(c - d) 的更快实现?

algorithm - 计算递归算法的时间复杂度 T(n) = T(k) + T(n-k)