到行N-1的任何路径的最大总和

时间:2014-11-01 11:35:01

标签: java data-structures dynamic-programming recursive-datastructures

有一个N * N整数矩阵Arr[N][N]。从行r和列c,我们可以转到以下三个索引中的任何一个:

予。 Arr[ r+1 ][ c-1 ] (valid only if c-1>=0)

II。 Arr[ r+1 ][ c ]

III。 Arr[ r+1 ][ c+1 ] (valid only if c+1<=N-1)

因此,如果我们从第0行的任何列索引开始,那么直到第N-1行的任何路径的最大总和是什么。

2 个答案:

答案 0 :(得分:0)

您可以像这样解决这个问题:

设M是NxN整数矩阵A中的最大数。定义一个新的N * N矩阵B,其中b[i,j] = M - a[i,j] + 1。 B只包含正整数。遍历方法对应于矩阵的单元格上的某个明确定义的方向图。现在使用此图上的 dijkstra algorithm,其中每个节点到上面三个节点(或边缘情况下两个节点)的距离简单地等于数字b[i,j]。 dijkstra算法将为您提供“最短”的算法。此图中的路径,对应于矩阵A中具有最大总和的路径。

为了解这个问题可以通过这种方式解决的原因,假设存在x序列s1,s2,s3,...,sx等长N.某些序列si将具有最大的和。如果我们取序列t1,t2,...,tx使得t1k = -s1k,则最大和s是最小和t。如果我们然后为每个序列中的每个值添加一个常量,那么具有最大总和的t序列不会改变,因为这些序列中的每一个都是相同的长。

答案 1 :(得分:0)

可以使用动态编程或使用递归来解决此问题。 以下是使用动态编程方法用Java编写的解决方案:
http://design-interviews.blogspot.com/2014/11/largest-sum-of-any-of-paths-till-row-n.html

解决方案的时间复杂度为O(n ^ 2)。 该解决方案改变了原始输入矩阵。如果需要保持原始矩阵不变,则需要使用另一个二维阵列。