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) 的成本是
这是我在
中使用动态编程的解决方案
你从 (1,1) 开始,所以你可以通过 a = value(1,1) value(1,2) 找到 a = (1,2) 和 b = (2,1)。然后,要找到 (2,2),选择最小值
给定矩阵
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 并选择 m
最短路径:
1 2 3 | 1 3 6 5 8 . 12 . . |
所以要找到 (3,2) 选择
最短路径:
1 2 3 | 1 3 6 5 8 12 12 16 . |
所以最后一个
最短路径:
从 (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* 也是一种选择。