算法问题

时间:2011-05-29 11:05:37

标签: algorithm

https://liahen.ksp.sk/为比赛提供了一些训练问题。但他们没有解决方案。所以我想问你如何解决这个问题,因为我试图解决它几个小时仍然没有。

问题: 我们有一些长度L公里的线。有人站在这条线的中间。我们有两个数字的列表:x,y和z - y是z crate将落到道路的x-th公里的时间(以秒为单位)。人可以每秒向左或向左移动或移动一公里。为了捕获板条箱,人必须到达他们将要落入的第二个地方。

该算法的目的是找到一种方法来保存最大数量的板条箱。

2 个答案:

答案 0 :(得分:1)

我这样做是一个dp问题:每次,对于你可以站立的每个地方,都要存放你可以捕获的最大数量的板条箱。

运行时间为O(L * timesteps)

编辑: 如果L与丢弃点的数量相比非常大,那么只能在丢弃点处存储信息,从而节省了一些性能:

  • 表示每个drop point store与左邻居和右邻居的距离,以及一个缓冲区,指示此时t-i收集的i从0到邻居的最大距离t-distance
  • 在每个时间步,对于每个丢弃点,在时间O(droppoints*timesteps)获取从每个邻居收集的可能包,并选择最佳值。
  • 添加此时丢弃的包装箱数量(如果有)。

此算法在O(L)中运行,但使用{{1}}空格。

答案 1 :(得分:0)

您可以使用dynamic programming解决此问题。 这是您需要解决的基本递归关系。

saved[y][x] = max(saved[y-1][x-1],saved[y-1][x+1],saved[y-1][x])+crates[y][x]
  • crates [y] [x]:在位置x落在时间y的#crate。您可以从输入数据创建此数组。
  • 已保存[y] [x]:到目前为止已保存的最大包装箱数y在时间y处于x位置。

该等式基于以下事实:在时间y-1(之前的1个步骤),您只能位于x + 1或x-1或x(保持在同一位置)的位置,所以请看两个选项并选择一个可以保存最多箱子的选项,然后添加保存的箱子,因为你现在在时间y的位置x(即板条箱[y] [x])

假设你从x = 0开始,时间y = 0。 然后保存[0] [x] = 0(假设条件箱在时间y> 0时开始下降),然后你可以使用上面的等式进行DP。

您的最终答案是找到保存[y] [x]的最大值。