我们在动态编程任务中得到了这个问题:
在新的电脑游戏"疯狂的DP点收集器",播放器 引导标有
n
的{{1}}个房间的头像。游戏持续1,...,n
时间单位。玩家可以跳过一个房间,或者在一个房间内花费1, 2或4个时间单位。每个房间T
和每个1<=i<=n
j
,我们会得到值{1,2,4}
,表示有多少分 玩家可以在C(i,j)
分钟内在i
房间内收集。众所周知 适用于所有j
i
- 玩家可以在游戏中收集的最大分数是多少?
- 为了实现这个目标,玩家应该在每个房间花多少时间单位?
醇>
我在考虑一个二维数组,其中行代表房间,列代表时间单位。一个子问题是&#34;我可以在T-x时间内收集的最佳点数是多少?#/ p> 经过长时间的脑力激荡,我陷入了困境。任何帮助将不胜感激。
答案 0 :(得分:1)
我假设了一些事情 - 如果我错了,请纠正我:
玩家需要按此顺序穿过房间,即使之前跳过8,她也不能从房间9跳回到房间8;因此,four rooms的有效路径可以是
中的任何一个1-2-3-4
1-3
2-4
没有惩罚,只有奖励,C(i,j)>=0
所有i,j
一个更简单的子问题是“在t
个时间步之后我可以制作的最高积分是多少,以房间号k
结束?”。让我们调用这个子问题F(k,t)
的解决方案。我们是怎么来到这里的?
好吧,如果我们在k
房间,那么我们必须花费1,2或4个时间单位坐在这里。我们的“最佳前任”就是k' < k
我们去过dt = 1, 2
或4
步骤前的一个房间:
由于我们可以跳过任意数量的房间,我们可以从任何总费用为0的房间开始:
一旦我们获得了表F
的所有值,我们选择最终的房间
其中F(K,T)
是问题(1)的答案。对于问题(2)的答案,我们通过遵循我们存储的后退指针来重建最佳路径,同时评估最佳前辈的最大化。我省略了这个相当技术性的步骤,但是如果你想在这里详细说明,请告诉我。
我们需要评估n*T
个子问题,表格F
中的每个字词都可以通过考虑最多n
个可能的前任房间来构建过去(1,2和4步前),所以操作的总数将与3*T*n^2
成比例(我认为你可以通过存储一些来实现摆脱3
的实现中间最大值)。