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