首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定两个非负数数组,求出乘积的最小和。

给定两个非负数数组,求出乘积的最小和。
EN

Stack Overflow用户
提问于 2015-10-19 22:50:53
回答 1查看 1.3K关注 0票数 6

给定两个数组AB,每个数组都包含n非负数,从B结束时从A和b>0元素的末尾移除a>0元素。评估这样一个操作的成本,例如X是从A中删除的a元素和YB中删除的元素之和。继续这样做,直到两个数组都为空。目标是将总成本降到最低。

使用动态规划和最优策略总是从AB中提取一个元素的事实,我可以找到一个O(n^3)解。现在我很想知道这个问题是否有更快的解决方案?

编辑:从注释中的@递归中窃取一个示例:

A= 1, 9,1和B= 1,9,1.费用为20. (1) * (1 + 9) + (9 + 1) * (1)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-27 22:43:52

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

代码语言:javascript
复制
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))

有基例

代码语言:javascript
复制
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))

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33225258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档