【问题标题】:Maximal sum of products of two lists两个列表乘积的最大和
【发布时间】:2019-05-09 16:30:21
【问题描述】:

我需要编写一个基于动态编程方法的算法,老实说我完全卡住了。

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

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

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

我真正需要帮助的是找到递归函数。而且我真的找不到。如果有人能帮我解决这个问题,我将不胜感激。

最好的问候

【问题讨论】:

  • 你能用你提供的 2 个列表举一个例子吗?外部读者仍然不清楚。
  • 据我了解,要求是从两个列表中找到一组对,使得对中的数字要么在一个列表中相邻,要么在同一位置在这两个列表中,我们希望最大化这些对乘积的总和。我猜在这个例子中答案是 {(63,73), (43,10), (40,12), (5,13)}
  • 假设列表元素是 A 和 B 两个系列的剧集的收视率。剧集每周成对播放。剧集必须以连续的方式显示。所以主播希望以最大化“收视率”的方式播放节目。因此,如果他们决定在第一周播放 A0、A1 它将是 43 * 10,如果是 A0、B0 它将是 63*43 等等。所以他们希望以这种组合播放剧集以最大化收视率乘积的最终总和
  • 那么所提供数据的“正确”答案是什么? (63,73)?
  • 是63*73 + 43*10 + 40*12 + 5*13

标签: python algorithm recursion dynamic-programming


【解决方案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

当然,需要适当的边界处理。

【讨论】:

  • 嗨,您的回答对我帮助很大,但是我仍然不确定这些边界处理是什么?我唯一能想到的是如果 i
  • 如果i是第一个元素,则没有横向匹配的选项。此外,您需要确保存在S(i - 1)S(i - 2)。如果没有,请使用0
  • 据我所知,代码应该是这样的:def func(i): if i == 0: return a[i] * b[i] elif i > 0: return max(func(i - 1) + a[i] * b[i], func(i - 2) + a[i - 1] * a[i] + b[i - 1] * b[i]) else: return 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多