查找矩阵从[0,0]到最后一行的长度为N的最大成本路径的算法
问题内容:
我有一个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
问题答案:
您可以使用动态编程解决此问题。让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上对其进行测试