【发布时间】:2014-01-14 05:23:26
【问题描述】:
你必须将一根长度为
l的棍子切成几块。必须在位置c1, c2, c3, ..., cn进行切割,其中ci是1和n-1(含)之间的整数。切割的成本等于制作它的棍子的长度。削减的顺序应该是什么以最小化运营的总体成本?例如,考虑一根长度为
10的棍子,并且必须在位置2, 4, 7进行切割。你可以按照给定的顺序剪断木棍。第一次切割将花费10,因为棍子的长度为10。第二次切割将花费8,因为进行切割的剩余木棍的长度为10 - 2 = 8。最后一次切割将花费6,因为剩余木棍的长度是10 - 4 = 6。总费用为10 + 8 + 6 = 24但是,如果我们按照以下顺序切断棍子:
4, 2, 7,我们会得到10 + 4 + 6 = 20的成本,这对我们来说更好。设计一个算法来解决这个问题。
我很确定这是一个 DP 问题。我可以看到一个诱人的递归关系,如果我们砍一根棍子,我们会得到两根更小的棍子。如果我们知道这两根棍子的最佳解决方案,我们可以很容易地找出较大棍子的最佳解决方案。但这将是非常低效的。
如果你有一个递归函数min_cost(stick_length, c_1, c_2, ..., c_n),它返回在c_1, c_2, ..., c_n处切割一根长度为stick_length的棍子的最小成本,那么递归关系看起来像这样
min_cost(stick_length, c_1, c_2, ..., c_n) =
stick_length
+ minimum(min_cost(c_1, a_1, a_2, ..., a_i)
+ min_cost (stick_length - c_1,
a_(i+1), ..., a_(n-1)),
min_cost(c_2, a_1, a_2, ..., a_i)
+ min_cost(stick_length - c_2,
a_(i+1), ..., a_(n-1)), ... ,
min_cost(c_n, a_1, a_2, ..., a_i)
+ min_cost(stick_length - c_n,
a_(i+1), ..., a_(n-1)))`,
其中a_1, a_2, ..., a_n 是要剪切的剩余位置的排列。我们必须将所有可能的排列传递给递归函数,而不仅仅是我写的一个。
这显然是不切实际的。我该如何解决这个问题?
【问题讨论】:
-
^这正是我想知道的。
-
我认为完整的解决方案不会太复杂。这个问题来自信息学奥林匹克。
-
@Gerard 每次切割,你都会把整根棍子分成另外两根棍子,所以你只需要为那两根棍子调用另一个递归函数,这有助于减少公式。只需要对c1、c2 ...进行排序并处理一些计算。
-
@PhamTrung:我不知道要在哪根棍子上做哪一个切口。升序排序有什么帮助?
-
如何联系 Andrew Barber?我不知道他为什么搁置这件事。他甚至还没有发表评论。
标签: algorithm