【发布时间】: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