给定2个非负数的数组,找到最小的乘积之和

时间:2015-10-19 22:50:54

标签: algorithm dynamic-programming

给定两个数组AB,每个数组包含n个非负数,从A的末尾删除a>0个元素,从中删除b>0元素B的结尾评估X*Y这样的操作的成本,其中X是从aA中删除的Y元素的总和已从b中删除B个元素。继续这样做直到两个数组都为空。目标是最小化总成本。

使用动态编程以及最优策略始终只从AB中获取一个元素的事实我可以找到O(n ^ 3)解。现在我很想知道这个问题是否有更快的解决方案?

编辑:在评论中窃取@recursive中的一个例子:

  

A = [1,9,1],B = [1,9,1]。可能与20的成本有关。(1)*   (1 + 9)+(9 + 1)*(1)

1 个答案:

答案 0 :(得分:4)

这是O(n^2)。让CostA(i, j)成为消除A[1..i], B[1..j]的最低成本,使第一次删除只需要B中的一个元素。让CostB(i, j)成为消除A[1..i], B[1..j]的最低成本,使第一次删除只需要A中的一个元素。我们有相互递归的重现

CostA(i, j) = A[i] * B[j] + min(CostA(i - 1, j),
                                CostA(i - 1, j - 1),
                                CostB(i - 1, j - 1))
CostB(i, j) = A[i] * B[j] + min(CostB(i, j - 1),
                                CostA(i - 1, j - 1),
                                CostB(i - 1, j - 1))

有基本案例

CostA(0, 0) = 0
CostA(>0, 0) = infinity
CostA(0, >0) = infinity
CostB(0, 0) = 0
CostB(>0, 0) = infinity
CostB(0, >0) = infinity.

答案是min(CostA(n, n), CostB(n, n))