下面的算法(伪代码)的时间复杂度是多少?我很难分析它。它是另一个线程指定的问题的实现:Algorithm to find max cost path of length N in matrix, from [0,0] to last row。但是因为我是新来的,我没有足够的分数在线程中评论(我认为)?这是我的第一篇文章,请原谅我,如果我做错了什么。
该算法使用cache[][][][]
的记忆。在初始化期间cache[][][][]
填充-1。
使用maxPath(0,0,m,DOWN)
调用该方法。其中m是要采取的步数,n< = m< = n ^ 2,方向定义为DOWN = 0,LEFT = 1,RIGHT = 2.
function maxPath(i, j, fuel, direction)
if i = n OR j = n OR j < 0 OR fuel = 0 then
return 0;
end if
if cache[i][j][f-1][d] != -1 then
return cache[i][j][f - 1][d];
end if
ret := 0
acc+ = matrix[i][j]
ret:=max(ret,maxPath(i+1, j, fuel-1, DOWN))
if f > n - i then . If there is enough steps to move horizontally
if d = RIGHT or d = DOWN then
ret:=max(ret,maxPath(i, j+1, fuel-1, RIGHT))
end if
if d = LEFT or d = DOWN then
ret:=max(ret,maxPath(i, j-1, fuel-1, LEFT))
end if
end if
return cache[i,j,fuel-1,direction] = ret + matrix[i][j]
end function
答案 0 :(得分:1)
Okey我已经解决了它,并且认为我应该分享我的结果。
如果我们让G =(V,E)是一个图,其中V = {maxPath(i,j,p,d):对于所有可能的i,j,p和d}和E = {uv:u = f(i,j,p,d)和v = f(i',j',p',d')}。我们有G是状态图,它显然是DAG(有向无环图)。然后,我们可以使用memoization计算maxPath。
我们有
n possible values for i
n possible values for j
m possible values for fuel (which in worst case is n^2)
3 possible values for direction
然后我们调用maxPath的n * n * m * 3个不同函数,在最坏的情况下是n ^ 4 * 3。所以,我们有O(n ^ 4)个不同的函数。每次调用函数都在O(1)时间运行。因为图形具有次优结构,所以每个子问题都是原始问题。因此,通过memoization,我们不必两次计算相同的“函数”,因此我们得到O(n ^ 4)。