我需要在我的程序中实现这一点,让我们说我们已经给出了大小为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时间复杂度的递归来解决,但我需要更快的解决方案,请给我一些提示。
答案 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