一尘不染

查找矩阵从[0,0]到最后一行的长度为N的最大成本路径的算法

algorithm

我有一个n*n矩阵,其中每个元素代表一个整数。从头开始,[0,0]我必须找到精确m到最后一行的元素的路径,并返回最大成本。该路径可以在最后一行的任何列中结尾,并且n ≤ m ≤ n^2

我想到要找到m[0,0]到的所有长度的路径[n-1, 0], [n-1, 1] ... [n-1, n-1]。但是感觉并不理想…

哪种算法是最有效的方法?是BFS还是DFS?

编辑

可能的方向是向下/向右/向左,但每个元素最多只能访问一次。

编辑2

因此,例如,如果给出此矩阵(n = 4):

[   1   4   1  20 ]
[   5   0   2   8 ]
[   6   8   3   8 ]
[   3   2   9   5 ]

m = 7,路径可能是

[   →   →   →   ↓ ]
[   5   0   2   ↓ ]
[   6   8   3   ↓ ]
[   3   2   9   x ] = Path cost = 47

要么

[   ↓   4   1  20 ]
[   ↓   0   2   8 ]
[   →   →   ↓   8 ]
[   3   2   →   x ] = Path cost = 32

或者如果 m = n^2

[   →   →   →   ↓ ]
[   ↓   ←   ←   ← ]
[   →   →   →   ↓ ]
[   x   ←   ←   ← ]

编辑3 /解决方案

感谢WanderleyGuimarães,
http://ideone.com/0iLS2


阅读 228

收藏
2020-07-28

共1个答案

一尘不染

您可以使用动态编程解决此问题。让value(i, j)值从(i, j)矩阵的位置开始(第i行,第j列)。

if i <  0 then f(i, j) = 0
if i == 0 then f(i, j) = value(i, j)
if i >  0 then f(i, j) = max(f(i-1, j), f(i, j-1)) + value(i, j)

该递归假设您下台时使用矩阵中的头寸。因此,您的答案是max(f(m, 0), f(m-1, 1), f(m - 2, 2), ..., f(1, m))

例如:

给出以下矩阵n = 4

1 1 1 1
1 2 1 1
2 1 1 1
1 2 1 1

如果那样的m = 2话,你不能在第二行之后。你的答案是f(2, 2) = 4

如果那样的m = 4话,你不能去第三行。你的答案是f(3, 2) = 5

(我正在学习英语,所以如果您听不懂,请告诉我,我会尽力改善我的解释)。

编辑::允许向下/向左/向右移动

您可以实现跟踪重复:

if i == n, j == n, p == m, j == 0 then f(i, j, p, d) = 0
if d == DOWN  then f(i, j, p, d) = max(f(i+1, j, p+1, DOWN), f(i, j-1, p+1, RIGHT),   f(i, j+1, p+1,LEFT)) + value(i, j)
if d == LEFT  then f(i, j, p, d) = max(f(i+1, j, p+1, DOWN), f(i, j+1, p+1, LEFT )) + value(i, j)
if d == RIGHT then f(i, j, p, d) = max(f(i+1, j, p+1, DOWN), f(i, j-1, p+1, RIGHT)) + value(i, j)

此解决方案是O(n^4)我正在努力改善它。

您可以在http://ideone.com/tbH1j上对其进行测试

2020-07-28