https://liahen.ksp.sk/为比赛提供了一些训练问题。但他们没有解决方案。所以我想问你如何解决这个问题,因为我试图解决它几个小时仍然没有。
问题: 我们有一些长度L公里的线。有人站在这条线的中间。我们有两个数字的列表:x,y和z - y是z crate将落到道路的x-th公里的时间(以秒为单位)。人可以每秒向左或向左移动或移动一公里。为了捕获板条箱,人必须到达他们将要落入的第二个地方。
该算法的目的是找到一种方法来保存最大数量的板条箱。
答案 0 :(得分:1)
我这样做是一个dp问题:每次,对于你可以站立的每个地方,都要存放你可以捕获的最大数量的板条箱。
运行时间为O(L * timesteps)
编辑: 如果L与丢弃点的数量相比非常大,那么只能在丢弃点处存储信息,从而节省了一些性能:
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]
该等式基于以下事实:在时间y-1(之前的1个步骤),您只能位于x + 1或x-1或x(保持在同一位置)的位置,所以请看两个选项并选择一个可以保存最多箱子的选项,然后添加保存的箱子,因为你现在在时间y的位置x(即板条箱[y] [x])
假设你从x = 0开始,时间y = 0。 然后保存[0] [x] = 0(假设条件箱在时间y> 0时开始下降),然后你可以使用上面的等式进行DP。
您的最终答案是找到保存[y] [x]的最大值。