给出了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 有人可以解释如何处理这个问题吗?
答案 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 *也可以选择。