路由到交叉矩阵收集最大总和

时间:2014-02-06 13:36:46

标签: algorithm

所以当我翻阅一本书时,我偶然发现了一个有趣的问题。 你得到一个N * M矩阵,你必须从坐标(1,1)到(n,m)。

您可以使用三种类型的“操作”来与矩阵交叉。

'A'- You go from i,j to i+1,j

'B'- You go from i,j to i,j+1

'C'- You go from i,j to i+1,j+1

每次越过元素时,都会将其添加到“sum”中。你被要求:

  1. 找出您可以收集的最大金额。
  2. 在不使用/重新使用N * M矩阵的情况下重建路径。
  3. 我用动态编程解决了问题(1),但是(2)让我陷入了困境。这本书对第(2)点没有任何解释。想知道你们中是否有人遇到过类似的事情。

2 个答案:

答案 0 :(得分:1)

DP的一般经验法则:如果除了获得最佳值之外还需要重建最优解,请使用第二个数组。第二个数组的大小应与存储子问题的答案的大小完全相同。但是,在此数组中,不存储答案,而是存储导致最佳解决方案的子问题的一些标识。在您的情况下,标识将为ABC,以表明您所做的移动。

答案 1 :(得分:0)

您可以仅使用子问题解决方案阵列(让我们称之为D)重建路径本身,而无需任何其他数组。只需使用以下规则从(n, m)(1, 1)向后转:

  • 如果D[i][j] == D[i - 1][j],请将(i-1, j)添加到答案序列的开头
  • 如果D[i][j] == D[i][j - 1],请将(i, j - 1)添加到答案序列的开头
  • 否则将(i - 1,j - 1)添加到答案序列的开头。

你可以很容易地证明(记住这一点 D[i][j] = M[i][j] + max(D[i - 1][j], D[i][j - 1], D[i - 1][j - 1])
 其中M是初始矩阵),这将导致您(1,1),并且结果序列确实是最大总和路径。