在网格中找到大多数K移动和最高分数的路径

Find path in grid with mostly k moves and maximum score

本文关键字:最高分 路径 移动 网格 大多数      更新时间:2023-10-16

我正在尝试解决以下问题:由正整数的M网格给出N,找到一个最大得分,可以从左上角到右下角。路径的分数是您在上述路径上收集的所有值的总和(在同一单元格上停留是可能的转弯(。同样,路径的长度必须主要是L。例如:假设我们有以下网格(N = 5M = 6(:

1  1  1  1  1  1
10 10 1  1  1  1
1  10 1  10 10 10
1  10 10 10 1  10
1  1  1  1  1  1

如果L = 10,答案应为83。

1
10 10
   10 
   10 10 10 1 10
              1

并在10个转弯之一上停留。

如果L = 11,答案应为102。您可以通过在原始网格中遵循10路径来得到。

我提出了复杂性o(n^2*m^2*l(的算法,但这太慢了,因为n和m可以达到100,而L可以达到1000。我的算法的基本想法如下:计算每个元组(i1, j1, i2, j2, k)的答案,其中(i1, j1)是起始单元,(i2, j2)是目标单元格,而k是路径长度。我从k = 0开始,然后延长到L。您对我如何优化这个想法有任何建议吗?甚至对问题的全新见解?

一种可能的方法是为表格的每个元组进行计算( i j k (,长度路径的最大分数恰好 k ,从单元格(0,0(开始,以( i j 。让我们将此值表示为最佳( i j k (。

按照惯例,如果没有长度k的路径k从(0,0(开始,并以( i j (结尾,我们希望拥有最好的( i j k (= -Infinity。


对于 k = 1,有一个长度1的单个路径,该路径从上左上角开始,因此:

  • 最佳(0,0,1(= input_matrix(0,0(。
  • 最佳( i j ,1(= -Infinity,如果( i j (为不是(0,0(。

对于 k > 1我们可以使用最佳( i j k (的值来计算。最佳( *, *, k -1(:

best( i j k (= input_matrix( i j em>( max(best( a b k -1((,其中 max被所有 a b ,使得单元格( a b (是细胞的邻居( i j (。


现在,已经构建了最佳矩阵,可以通过计算来找到原始问题的答案:

max(best( n -1, m - 1, k ((,其中 max被占用了所有k 在1和 l 之间。


这种方法的复杂性是 o (n·m·l(。