最大化网格上螺旋路径的总和

时间:2014-05-05 23:56:33

标签: algorithm prefix

让我们将一条螺旋路径定义为一个运动处于[右,下,左,上,右,下,左,上,......]循环的路径(请注意,您不一定要从是的,只有那个权利必须在追求之后,在追求权利之后,等等。但是,路径不得与自身相交。

给定一个网格,你如何找到通过这条路径可以获得的最大总和?

例如,如果网格是

  

-5 -4 -3

     

3 2 1

     

-1 2 4

最大化总和的螺旋路径是

  

-5 -4 -3

     

3 2 1

     

-1 2 4

路径如下:{3,2,1,4,2}


我的想法是,这可以用某种前缀和方法解决,但我不太确定如何处理它。另一个想法只是从每个点运行深度优先搜索,但算法效率太低。

1 个答案:

答案 0 :(得分:1)

让我们以顺时针方向向外构建螺旋(逆时针的情况类似)。建筑过程的状态可以用三个变量来描述:

  • 到目前为止螺旋的边界框
  • 当前位置
  • 当前方向(北,东,南,西)

我们最多允许两个不同的举动:

  • 在当前方向上更进一步
  • 顺时针切换方向,向新方向移动一步。只有在我们已经通过边界框的边界
  • 时才允许这样做

有O(n ^ 4)个边界框,当前位置始终位于框的边界,因此产生一个O(n ^ 5)时间和空间DP算法。

我们可以通过注意除了我们行走的最后一个线段之外的所有线段将完全覆盖当前边界框的一侧来消除一个维度,因此我们可以将f(x1,y1,x2,y2,d)定义为最大总和带有边界框(x1,y1),(x2,y2)的螺旋,其中当前位置位于由当前位置d唯一定义的角落中。

接下来是:

  • 在当前方向上向前走一步,扩展边界框
  • 切换方向并一直走到边界框的末尾

对于第二步,我们需要在O(1)中计算部分行和列和,这对于某些预处理很容易。我们还需要为螺旋的最后一段引入一个特殊情况,因为我们不允许它们到达边界框的边缘。整个算法可以在O(n ^ 4)中实现。