关于算法:迷宫遍历数字之和

maze traversal sum of digits

给出了一个 NxN 的网格。每个点都被分配一个值,比如 num

从 1,1 开始,我们必须遍历到 N,N。

如果 i,j 是当前位置,我们可以向右或向下。
如何通过沿任意路径从 1,1 遍历到 n,n 来找到最小数字总和
任何两点可以有相同的数字

1 2 3

4 5 6

7 8 9

1 2 3 6 9 = 21
n <=10000000000

输出 21
有人能解释一下如何解决这个问题吗?


这是一个动态规划问题。这里的子问题是到达任何给定方格的最小成本/路径。因为你只能向下和向右移动,所以只有两个方格可以让你进入给定的方格,一个在上面,一个在左边。因此到达正方形 (i,i) 的成本是 min(cost[i-1][i], cost[i][i-1]) + num。如果这会使您超出范围,请仅考虑网格内的选项。从左到右计算每一行,先做顶行,然后再往下计算。您在 (N,N) 处获得的成本将是最低成本。


这是我在 O(n^2)

中使用动态编程的解决方案

你从 (1,1) 开始,所以你可以通过 a = value(1,1) value(1,2) 找到 a = (1,2) 和 b = (2,1)。然后,要找到 (2,2),选择最小值 (a+ value(2,2)) and (b + value(2,2)) 并继续执行此逻辑。您可以使用该算法找到 (1,1) 和 (i,j) 之间的任何最小总和。让我解释一下,

给定矩阵

1
2
3
4
5
1 2 3

4 5 6

7 8 9

最短路径:

1
2
3
1 3 .
5 . .
. . .

所以要找到 (2,2),从给定矩阵中取原始值 (2,2)=5 并选择 min(5 + 5), 3 + 5) = 8。所以

最短路径:

1
2
3
1 3 6
5 8 .
12 . .

所以要找到 (3,2) 选择 min (12 + 8, 8 + 8) = 16 and (2,3) = min(8 + 6, 6 + 6) = 12

最短路径:

1
2
3
1 3 6
5 8 12
12 16 .

所以最后一个(3,3) = min (12 + 9, 16 + 9) = 21

最短路径:

从 (1,1) 到任意点 (i, j)

1
2
3
1 3 6
5 8 12
12 16 21


您可以将网格转换为图表。边缘从网格元素中获取值的权重。然后你可以找到最短路径问题的解决方案。

1
2
3
4
5
6
7
8
9
start--1--+--2--+--3--+
          |     |     |
          4     5     6
          |     |     |
          +--5--+--6--+
          |     |     |
          7     8     9
          |     |     |
          +--8--+--9--end


尝试:

从第一行开始计算累积值并存储。
继续到第二行,现在这些值只能来自左侧或顶部(因为您只能向左或向下),计算该行的累积值中的最小值。
向下迭代直到最后一行,当您到达最后一个节点时,您将能够获得最小值。

我声称这个算法是 O(n),因为如果您使用二维数组,您最多只需要访问所有字段两次(从顶部,左侧读取)进行读取和一次写入。


Can someone explain how to approach the problem?

阅读动态规划并从那里开始。


如果您想要真正花哨或必须对大量矩阵进行运算,A* 也是一种选择。