【问题标题】:greedy algorithm matrix of 0\10\1的贪心算法矩阵
【发布时间】:2014-01-02 10:06:30
【问题描述】:

我正在学习算法考试,但找不到解决下一个问题的方法:

INPUT:正整数 r1,r2....rn 和 c1,c2....cn

输出:一个 n × n 矩阵 A 具有 0/1 个条目,使得对于所有 i 中的第 i 行的总和 如果存在这样的矩阵,A 是 ri,A 中第 i 列的和是 ci。 考虑以下逐行构造 A 的贪心算法。假设第一个 i-1 行已构建。设 aj 是前 i-1 行中第 j 列中 1 的数量。具有最大 cj-aj 的 ri 列在 row 中分配为 1,其余的 的列分配了 0。也就是说,仍然需要最多 1 的列被赋予 1。使用交换参数正式证明该算法是正确的。

因此,对于遇到的大多数贪婪问题,我尝试做的就是将其包含在归纳中, 假设贪心解决方案中直到第 i 行的行与最优解决方案相同,然后尝试更改第 i+1 行,使其匹配贪心解决方案并证明它不会创建不太理想的解决方案到最优给定。然后保持它进行 k-i 迭代,直到整个解决方案相似。

在尝试不成功后,我仅在每个坐标假设 ij 坐标是第一个不匹配的坐标并再次失败后尝试了相同的想法。

然后我尝试了一种不同的方法,假设我在贪婪中有一组步骤并交换了算法的整个步骤(这与第一个基本相同)但我仍然没有设法找到方法保证我没有创建一个不太理想的解决方案。

提前感谢您的帮助。

【问题讨论】:

    标签: algorithm matrix swap greedy


    【解决方案1】:

    考虑一些输入 rc 以及满足它们的矩阵 S

    S中最后一行的内容扔掉,得到一个新的矩阵S(n-1)。如果我们将S(n-1) 输入贪心算法并要求它填写最后一行,它显然会恢复一个令人满意的解决方案。

    好吧,现在扔掉S 中最后行的内容,得到S(n-2)。由于我们知道存在令人满意的解决方案,因此我们知道不存在j 使得c(j) - a(j) > 2,并且j 的数量使得c(j)-a(j) == 2 小于或等于r(n-1)。因此,贪心算法将为后一组j 设置A[n-1, j] = 1,以及为c(j)-a(j) = 1 设置其他一些j。但是因为我们知道有一个令人满意的解决方案,所以在n-1th 行被填满之后,jc(j) - a(j) == 1 的数量一定是r(n),因此是可满足的。

    无论如何,我们可以向下扩展:在S(n-k-1) 中必须是这样的:

    • 没有任何j 这样c(j) - a(j) > k+1
    • 最多可以有r(n-k) 很多j 这样c(j) - a(j) = k+1
    • Sum(c(j) - a(j)) == Sum(r(i), i >= n-k)

    那么在贪心算法处理完n-kth 行之后,一定是这样的

    • 没有任何j 这样c(j) - a(j) > k
    • 最多可以有r(n-k+1)很多j,这样c(j) - a(j) = k
    • Sum(c(j) - a(j)) == Sum(r(i), i >= n-k+1)

    因此当k = 0 时,没有任何j 这样c(j) - a(j) > 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2022-12-07
      • 1970-01-01
      • 2011-12-24
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多