用于解决流行算法路径遍历类型的方法

时间:2015-04-11 09:06:05

标签: algorithm matrix dynamic-programming

  • 给定一个矩阵,我们必须从每一行中选择一个值,以便选择的总价值成本最小。
  • 现在的问题是,如果我们在前面的行中选择了列“J”,我们就不能在“I”行中选择“0”到“J”列。
  • 也就是说,我们只是向右走,我们向下移动时不能左转。

我能想到的是,如果我们从最后一行开始然后向上移动那么我们必须寻找时间复杂度O(2^n)的所有可能组合,但是还有另一种有效的方法可以解决这类问题?

1 个答案:

答案 0 :(得分:0)

这是shortest path problem的变体,您的图表是:

G = (V,E)
V = { (x,y) | for each cell in the matrix } U { (-1,-1) } //assuming 0 based matrix
E = { ((x1,y),(x2,y+1)) | x1 < x2 } // or x1<=x2 - depends if you can go straight down
w((x1,y1),(x2,y2)) = value(x2,y2) //weight function

现在,这是一个图表(实际上是偶数Directed Acyclic Graph - DAG),您可以在其中将单最短路径算法从单个来源(-1,-1)应用到格式为(x,n-1)的多个目标 - 其中n是总行数。解决它的一种算法是Dijkstra's Algorithm


在理解这是一个DAG后,我们甚至可以使用直接DP解决方案进一步优化它(实际上模仿最短路径算法,但利用DAG功能):

D(-1,-1) = 0
D(x,y) = min { D(x', y-1) | for each x'>x }  U {infinity} + value(x,y)

最终答案是min{ D(x,n-1) | for all values of x}

此解决方案在O(n*m*m)中运行,其中n是行数,m是列数。