给定两个数组A
和B
,每个数组包含n
个非负数,从A的末尾删除a>0
个元素,从中删除b>0
元素B的结尾评估X*Y
这样的操作的成本,其中X
是从a
和A
中删除的Y
元素的总和已从b
中删除B
个元素。继续这样做直到两个数组都为空。目标是最小化总成本。
使用动态编程以及最优策略始终只从A
或B
中获取一个元素的事实我可以找到O(n ^ 3)解。现在我很想知道这个问题是否有更快的解决方案?
编辑:在评论中窃取@recursive中的一个例子:
A = [1,9,1],B = [1,9,1]。可能与20的成本有关。(1)* (1 + 9)+(9 + 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))
。