所以当我翻阅一本书时,我偶然发现了一个有趣的问题。 你得到一个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)让我陷入了困境。这本书对第(2)点没有任何解释。想知道你们中是否有人遇到过类似的事情。
答案 0 :(得分:1)
DP的一般经验法则:如果除了获得最佳值之外还需要重建最优解,请使用第二个数组。第二个数组的大小应与存储子问题的答案的大小完全相同。但是,在此数组中,不存储答案,而是存储导致最佳解决方案的子问题的一些标识。在您的情况下,标识将为A
,B
或C
,以表明您所做的移动。
答案 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)
添加到答案序列的开头你可以很容易地证明(记住这一点
D[i][j] = M[i][j] + max(D[i - 1][j], D[i][j - 1], D[i - 1][j - 1])
,
其中M
是初始矩阵),这将导致您(1,1),并且结果序列确实是最大总和路径。