擦除所有数字ai,其中1 <1。我&lt; n,按某种顺序,使总成本最小化

时间:2018-03-01 18:08:39

标签: algorithm optimization

我遇到了这个问题。但除了暴力之外,我无法想出任何解决方案。请提出一些有效的算法。 给你一个n个数的序列A =(a1,a2,...,an)。只需一步,您可以删除除最左侧和最右侧之外的任何数字。删除号码ai需要花费ai-1 * ai + 1。你的目标是擦除所有数字ai,其中1&lt;我&lt; n,按某种顺序,使总成本最小化。给出一个算法来实现你的目标,时间复杂度为O(n ^ 3)。

1 个答案:

答案 0 :(得分:2)

让DP [a,b]成为问题的解决方案“擦除a到b范围内所有元素的最低成本,不包括端点a和b本身”。

我认为删除元素的成本是元素之前和之后条目的乘积。

然后你可以通过向后思考并考虑“什么是最终的条目被删除?”来获得O(n ^ 3)算法。如果擦除的最后一个条目位于位置x,则将花费A [a] * A [b],并且之前我们需要擦除a和x之间的所有条目,以及x和b之间的所有条目。然而,这只是原始问题的另一个案例。

因此,我们可以根据以下重复情况正常建立DP表:

DP[a,b] = A[a]*A[b] + min( DP[a,x] + DP[x,b] for x in range a+1..b-1 )

表中有O(n ^ 2)个条目,计算每个条目需要O(n),总体O(n ^ 3)复杂度。