沿着直路位于不同位置的M个苹果(0 <= M <= 7)。
每个苹果在时间限制后死亡。你必须拿走所有的M苹果。
所以你需要找出你应该在他们的最后期限之前采取苹果的顺序,并从最合适的位置开始。
苹果j位于距离道路最左端的距离d [j]处。取苹果的时间是瞬时的,并且假设一个单位距离可以在1个单位时间内行进。找到你可以的最小时间拿走所有的苹果。
示例:让他们成为5个苹果,以下五行显示每个显示
的对(distance ,time to perish)
(1,3)
(3,1)
(5,8)
(8,19)
(10,15)
此处最短时间为11。
编辑:如果M变为更大的值,如50或100?
,该怎么办?显然,蛮力不会起作用
答案 0 :(得分:0)
尝试{1, 2,..., M}
的所有排列。从一个不是苹果斑点之一的位置开始是没有意义的。#34;排列会告诉您拾取苹果的顺序。找出所有这些排列所花费的最短时间。这会及时运行O(M*M!)
,速度足够快。
答案 1 :(得分:0)
我想我以前见过这样的东西,但我现在找不到它:我会根据我的记忆尝试重建一些东西。我会忽略给定的固定数量的苹果。
最好的答案是否可以在线内的苹果上完成?假设它确实如此,那么就在你拿起最后一个苹果之前,你已经在它的两侧捡到了苹果。但是你必须从最后一个苹果的一边走到另一边,所以当你走过它时,你会更好地拿起现在最后的苹果。因此,最好的解决方案必须通过拾取最左边的苹果或最右边的苹果来完成。
假设您知道为最左边的N-1个苹果解决问题的最佳成本,并且前往最右边的那些N-1个苹果。然后,您可以找到最合适的解决方案,最终可以在最合适的苹果上完成 - 这只是N-1 +可能的旅行成本和移动一步的成本。鉴于类似的信息,您可以计算出最有可能的解决方案的成本,该解决方案在最左边的苹果上完成。考虑到这两个成本,您可以花费最大的成本来拾取所有N个苹果,然后在必要时前往那些N的最左边(最右边)的苹果。
这显然是一种动态编程或记忆解决方案。形式少于2N ^ 2个子问题&#34;在k个苹果的连续区间解决问题的约束下找到最小成本,然后在必要时行进到那些k的最左边(最右边)苹果&#34 ;.给出k大小问题的最佳解决方案,你可以找出大小为k + 1的问题的最佳解决方案。所以这可以通过使用动态编程来解决,通过使用大小为k的条目构建所有部分解的表来构建大小为k + 1的条目或通过memoisation,使用递归来求解大小为k的解,同时解决大小为k的问题+1,但建立一个到目前为止找到的解决方案表,以便您永远不必两次解决相同的子问题。在任何一种情况下,所用的时间都会增加为N中的一些多项式,这比N!便宜。