使用动态编程在矩阵中找到最小和

时间:2017-03-26 13:23:56

标签: matrix dynamic-programming

我需要在我的程序中实现这一点,让我们说我们已经给出了大小为N * M的矩阵,其中N <= 100且M <= 15

现在我们必须找到最小的总和,以便我们应该从每列中选择一个元素,我们不能从同一行中的不同列中选择两个元素

例如,设N = 3,M = 2 我们有矩阵

[3,0],

[6,9],

[5,9],

我们可以选择3 + 9,6 + 0,6 + 9,5 + 0,5 + 9,但不能选择3 + 0。

我知道我可以用N ^ M时间复杂度的递归来解决,但我需要更快的解决方案,请给我一些提示。

1 个答案:

答案 0 :(得分:1)

让我们遍历从1到N的所有行。我们的动态编程状态将是(i, j)对,其中i是行号,已使用列的j位掩码(列将是掩码中从零开始)。我们将找到函数F(i, j)的值 - 最小和,可以使用前i行并从j中编码的列中获取元素。答案是F(N, (1<<M) - 1)的价值。复发:

F(0, 0) = 0
F(0, i) = MAXN, where i > 0        
F(i, j) = min(F(i-1, j), F(i-1, j ^ (1<<k)) + Matrix[i][k+1]), where 0<=k<M, j & (1<<k) != 0