【问题标题】:How to traverse a grid using two different paths to maximize the sum of the path?如何使用两条不同的路径遍历网格以最大化路径的总和?
【发布时间】:2014-01-10 04:00:01
【问题描述】:

我有一个 N × N 网格,每个框中都有值。我必须从左上角移动到右下角(路径 1)并从右上角移动到左下角(路径 2)。当我从左上角移动到右下角时,我只能向下或向右移动。同样,当我从右上角移动到左下角时,我只能左右移动。

但如果我在走路径 1 时向下移动,路径 2 的相应移动应该向左移动。同样,如果我在走路径 1 时向右移动,路径 2 的相应移动应该向下。

当我们采用两条路径时,我们总结了我们在每个框中遇到的值。我们能得到的最大值是多少?

以下面的网格为例:

 6   0   3  -1

 7   4   2   4

-3   3  -2   8

13  10  -1  -4 

我们可以采用的最佳路径表示如下:路径 1 用 * 表示,路径 2 用 ~ 表示。

(6*)  (0)   (3~)  (-1~)

(7*)  (4*~) (2~)  (4)

(-3)  (3*~) (-2*) (8*)

(13~) (10~) (-1)  (-4*)

这两条路径的总和是 56。

我们必须设计一种算法来计算给定任意 N × N 网格的最大可能分数。

很明显,这是一个 DP 问题。所以,我试图确定一个递归关系,可以这么说。我尝试使用经典问题中的递归关系,即在 N×M 网格中找到所有路径的最大总和,但这不起作用,因为它太复杂了。

我尝试将 N × N 网格划分为四个 (N-1) × (N-1) 重叠的网格,因此在 3 × 3 网格中进行演示:

a1 a2 a3

a4 a5 a6

a7 a8 a9

我把它分成了四个 2 x 2 的网格:

a1 a2  ,   a2 a3   ,   a4 a5   ,  a5 a6

a4 a5  ,   a5 a6   ,   a7 a8   ,  a8 a9

假设我们知道所有这些网格的最佳路径,那么我们能否计算出更大网格的最佳路径?

嗯,这看起来很有希望,但我很快发现这些递归关系依赖于更大的案例。例如,

如果我们考虑第二个 2 x 2 网格,假设我们知道最佳路径 1 并且路径 2 = S。现在,很明显,要从 a1 到 a2,我们需要向右移动,但这意味着子案例中的第一个动作(路径 2 中的第一个动作)应该向下,这是不能保证的。

我们如何解决这个问题?

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    移动这两个点的规则等同于在网格中找到一条路径,该路径是网格的总和,并且自身旋转 -90 度(向左 90 度/逆时针/逆时针,具体取决于您的语言环境)。

    左上角的“向下”对应于右上角的“左”,旋转-90度时为向下。左上角的“右”对应于右上角的“下”,当旋转 -90 度时为右。 (明白了吗?)

    所以你的示例网格是

     6-1   0+4   3+8  -1-4        5   4  11  -5
    
     7+3   4+2   2-2   4-1       10   6   0   3
                              =
    -3+0   3+4  -2+3   8+10      -3   7   1  18
    
    13+6  10+7  -1-3  -4+13      19  17  -4   9
    

    您现在可以通过任何常用方法找到从左上角到右下角的路径。实际上,您不需要路径,只需要最大和,这更容易:通过加法从左上角向下折叠矩阵。初始条件是上面的网格。下一步是将左上角的值添加到其有效邻居:

         9  11  -5
    
    15   6   0   3
    
    -3   7   1  18
    
    19  17  -4   9
    

    然后为具有两个有效邻居的任何网格点选择两个邻居中较大的一个(这里 21 大于 20 和 12):

            20  -5
    
        21   0   3
    
    12   7   1  18
    
    19  17  -4   9
    

    等等……

                15
    
            21   3              24
                    ->                  
        28   1  18           29 18     ->        47
                                                        ->  
    31  17  -4   9        48 -4  9            44  9            56
    

    我刚刚手动解决了您的 4x4 案例,答案是 56。

    【讨论】:

    • 其实答案是56。但错误在于你的计算。算法相当正确。
    【解决方案2】:

    您可以将其简化为一个网格上只有一条路径的情况。制作网格的第二个副本,旋转第二个副本,然后将它们矩阵相加,并仅使用一条路径在新网格上求解。从那里开始动态规划问题很容易(即计算每个节点的部分最大值)。

    【讨论】:

    • 是的,当然。我应该想到这一点。非常优雅的解决方案。
    猜你喜欢
    • 2020-09-12
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多