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

Algorithm 最大化网格上螺旋路径的和,algorithm,prefix,Algorithm,Prefix,让我们将螺旋路径定义为一个运动处于[右、下、左、上、右、下、左、上,…]循环中的路径(请注意,您不必从右开始,只需右在上、下在右之后,依此类推)。但是,路径不能与其自身相交 给定一个网格,您如何找到通过遍历这样一条路径可以获得的最大和 例如,如果网格是 -5-4-3 3 2 1 -1 2 4 使总和最大化的螺旋路径是 -5-4-3 3 2 1 -124 路径如下:{3,2,1,4,2} 我的想法是,这可以通过某种前缀和方法来解决,但我不太确定如何处理它。另一个想法是从每个点运行深度优先搜索,但

让我们将螺旋路径定义为一个运动处于[右、下、左、上、右、下、左、上,…]循环中的路径(请注意,您不必从右开始,只需右在上、下在右之后,依此类推)。但是,路径不能与其自身相交

给定一个网格,您如何找到通过遍历这样一条路径可以获得的最大和

例如,如果网格是

-5-4-3

3 2 1

-1 2 4

使总和最大化的螺旋路径是

-5-4-3

3 2 1

-124

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



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

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

  • 到目前为止螺旋的边界框
  • 当前位置
  • 当前方向(北、东、南、西)
我们最多可以采取两种不同的行动:

  • 朝当前方向再前进一步
  • 顺时针切换方向,并在新方向上前进一步。仅当我们已经通过边界框的边界时才允许此操作
有O(n^4)个边界框,且当前位置始终位于框的边界处,因此这将生成O(n^5)时间和空间DP算法

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

这些举措是:

  • 沿当前方向再向前走一步,延伸边界框
  • 切换方向并一直走到边界框的末端

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

这个问题属于堆栈交换网络中的另一个站点。对我来说,这是一个有趣的算法问题。这里有一个观察:任何螺旋路径都可以分成两段,第一段是“扩展”螺旋,第二段是“收缩”螺旋。(这两段中的任何一段的长度都可以是0。)由于任何矩形都可以被任意一种螺旋线完全覆盖,一种启发式方法是查看至少共享一个公共边界行或列的所有对矩形,沿该共享边界通过额外的单元连接这两个矩形,并获得最大的总体效果。(矩形和在O(n^2)预计算后为O(1))。请注意,这种方法总体上不是最优的,因为它忽略了跳过某些行和/或列的螺旋线的可能性。目前还不确定如何有效地适应这种情况。这只是子矩阵上的DP,但并不漂亮。您在DP中使用了什么状态转换?假设你在i,j,你可以从这里向右或向下移动。那么你会考虑哪个子矩形?@显然很明显,然后你把结果加起来。