【问题标题】:Choose one element from each row and column in matrix and the sum is minimized从矩阵的每一行和每一列中选择一个元素,并且最小化总和
【发布时间】:2012-12-11 15:47:17
【问题描述】:

如果你有一个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)x(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

【问题讨论】:

  • 能否请您澄清您的问题陈述(也可以举个例子)?
  • @Eugene 问题已编辑

标签: c# algorithm dynamic-programming


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多