从矩阵中的每一行和每列中选择一个元素,并将总和最小化

时间:2012-12-25 23:02:43

标签: c# algorithm dynamic-programming

如果您有一个正整数的NxN矩阵,并且要求您从每个行和列中精确选择一个元素,以便最小化所选元素的总和,如何解决?

我认为这是关于动态编程的。我试图使用memoization最小化O(n!)的时间:

    Dictionary<byte[,], int>[] memo = new Dictionary<byte[,], int>[17];

    int rec(byte[,] arr)
    {
        if (arr.Length == 1) return arr[0, 0];
        int opt = find(arr);
        if (opt != -1) return opt;
        opt = 1 << 25;
        for (int i = 0; i < arr.GetLength(1); ++i)
            opt = Math.Min(opt, arr[0, i] + rec(divide(arr, i)));
        add(arr, opt);
        return opt;
    }

这将从当前矩阵的第0行中选择一个元素,然后除以矩阵并递归调用自身以求解子矩阵。函数divide根据所选元素划分当前矩阵。然后,子矩阵大小为(N-1)×(N-1)。函数findmemo[n]中执行线性搜索,add将解决方案添加到memo[n]但这太慢了,因为它会将每个矩阵与其他矩阵进行比较。

你有一些改进吗?是否有更快的DP算法?任何帮助表示赞赏

示例

1     2     3    4

8     7     6    5

9     11    10   12

13    14    16   15

最佳解决方案:1 + 5 + 10 + 14

步骤:

7   6  5

11 10 12

14 16 15

11 10

14 16

14

1 个答案:

答案 0 :(得分:3)

这实际上是assignment problem。它可以使用Hungarian algorithm,和其他方法在多项式时间内求解。