DP点收集器 - 动态编程

时间:2018-01-31 19:37:53

标签: dynamic-programming

我们在动态编程任务中得到了这个问题:

  

在新的电脑游戏&#34;疯狂的DP点收集器&#34;,播放器   引导标有n的{​​{1}}个房间的头像。游戏持续1,...,n   时间单位。玩家可以跳过一个房间,或者在一个房间内花费1,   2或4个时间单位。每个房间T和每个1<=i<=n   j,我们会得到值{1,2,4},表示有多少分   玩家可以在C(i,j)分钟内在i房间内收集。众所周知   适用于所有j

i
     
      
  1. 玩家可以在游戏中收集的最大分数是多少?
  2.   
  3. 为了实现这个目标,玩家应该在每个房间花多少时间单位?
  4.   

我在考虑一个二维数组,其中行代表房间,列代表时间单位。一个子问题是&#34;我可以在T-x时间内收集的最佳点数是多少?#/ p> 经过长时间的脑力激荡,我陷入了困境。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我假设了一些事情 - 如果我错了,请纠正我:

  1. 玩家需要按此顺序穿过房间,即使之前跳过8,她也不能从房间9跳回到房间8;因此,four rooms的有效路径可以是

    中的任何一个
    • 1-2-3-4
    • 1-3
    • 2-4
  2. 没有惩罚,只有奖励,C(i,j)>=0所有i,j

  3. 一个更简单的子问题是“在t个时间步之后我可以制作的最高积分是多少,以房间号k结束?”。让我们调用这个子问题F(k,t)的解决方案。我们是怎么来到这里的?

    好吧,如果我们在k房间,那么我们必须花费1,2或4个时间单位坐在这里。我们的“最佳前任”就是k' < k我们去过dt = 1, 24步骤前的一个房间:

    enter image description here

    由于我们可以跳过任意数量的房间,我们可以从任何总费用为0的房间开始:

    enter image description here

    一旦我们获得了表F的所有值,我们选择最终的房间

    enter image description here

    其中F(K,T)是问题(1)的答案。对于问题(2)的答案,我们通过遵循我们存储的后退指针来重建最佳路径,同时评估最佳前辈的最大化。我省略了这个相当技术性的步骤,但是如果你想在这里详细说明,请告诉我。

    我们需要评估n*T个子问题,表格F中的每个字词都可以通过考虑最多n个可能的前任房间来构建过去(1,2和4步前),所以操作的总数将与3*T*n^2成比例(我认为你可以通过存储一些来实现摆脱3的实现中间最大值)。