迷宫遍历数字之和

时间:2011-01-13 20:53:45

标签: algorithm

给出了NxN的网格。为每个点分配一个值,表示num

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

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

1 2 3

4 5 6

7 8 9

1 + 2 + 3 + 6 + 9 = 21 n< = 10000000000

输出21 有人可以解释如何处理这个问题吗?

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

以下是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 6

7 8 9

最短路径:

1 3 . 
5 . . 
. . . 

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

最短路径:

1 3 6 
5 8 . 
12 . .

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

最短路径:

1 3 6 
5 8 12 
12 16 . 

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

最短路径:

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

1 3 6 
5 8 12 
12 16 21

答案 2 :(得分:1)

您可以将网格转换为图形。边缘从网格元素中获取值的权重。然后,您可以使用shortest path problem找到解决方案。

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

答案 3 :(得分:0)

  

有人可以解释如何解决问题吗?

了解动态编程并从那里开始。

答案 4 :(得分:0)

尝试:

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

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

答案 5 :(得分:-1)

如果你想真正想要或者必须在大型矩阵上操作,A *也可以选择。