【问题标题】:linear solution of grid constraints网格约束的线性解
【发布时间】:2016-03-05 06:49:23
【问题描述】:

您有一个 n x n 网格,其中有 n 行和 n 列。对于每一列 j,您将获得一个数字 Cj,对于每一行 i,您将获得一个数字 Ri。 你需要在网格上标记一些点,这样:

  • 每行标记点数最多为Ri;
  • 每列标记点数最多为Cj;
  • 您标记满足最后两个约束的最大点数并返回此点数。

输入为:n(网格的维度); Ri的序列和Cj的序列。

例如,在这个网格中,返回值为 34 example

在线性时间内找到一个算法:O(n) 或 O(n log(n)) 并带有演示。 我找到了 Max-Flow alg 的解决方案。但是复杂度太高了。

【问题讨论】:

    标签: algorithm dynamic-programming pseudocode greedy max-flow


    【解决方案1】:

    提示

    我建议按照从最大 Ri 到最小的顺序遍历行。

    跟踪每列有多少个空格。空格数从给定的 Cj 值开始。

    对于每一行,根据列中当前的空格数,在网格中标记尽可能多的点。确保首先将点放在空格数最多的列中。

    【讨论】:

    • 你确定这是必要的吗?执行匹配的二分图是完整的,所以我认为顺序并不重要。
    • 假设我们有 [2,2,2] 的列总和和 [2,2,2] 的行总和。如果我们做一个简单的贪心算法,我们会将列和减少到 [1,1,2],然后到 [0,0,2],然后发现我们无法分配最后一行中的值。
    • 此解决方案为 O(n^2),因为您必须迭代矩阵的单元格。您必须只返回最大点数而不表示它们。
    • @lorenzo188 排序:55421 55441。然后通过从列数组中减去来贪婪地分配每一行:55441 -> 44330 -> 33220 -> 22110 -> 11110 -> 11100。总的来说,我们能够减去 16 (5 + 4 + 4 + 2 + 1)
    • @lorenzo188 您可以使用更精细的数据结构将每次迭代的更新时间减少到 O(log n)。当然,嵌套循环不是一个非常有效的实现。基本上,您需要支持对一组大小为 n 的以下操作:(1)查找非零元素的数量(2)将每个非零元素减一。想到分段树(全二叉搜索树)或二叉索引树
    【解决方案2】:

    @NiklasB。使用增强的自平衡二叉搜索树,您可以在 O(Log n) 中将一个区间减 1,但是如何找到在 O(n) 的次要时间内不为零的元素数量?在这种情况下,例如输入4 3322 3322 3322 -> 2212 -> 1111 -> 0011 -> 0000 您取数字 3(行指示符的第一个元素)并将列的间隔 [0,2] 减 1,此成本为 O(Log n),并且列指示符都是 > 0,但是当您到达 0011 时,您必须提醒 2 为零,因为如果您在行中有 3,如果您不想要一个负数,您只能减去 2。如果您说零的数量你只能取 n - 0 的间隔。但是你如何在不是 O(n) 的复杂度时间内管理这个问题?

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多