我正在学习算法考试,我无法找到解决下一个问题的方法:
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列被分配为1行,其余为 列的分配为0。也就是说,仍然需要最多1的列被赋予1。使用交换参数正式证明此算法是正确的。
所以我尝试做的事情就像我遇到的最贪婪的问题一样,将它包装在感应中, 假设贪婪解决方案中第i行的行和最佳解决方案是相同的,然后尝试更改第i + 1行以使其与贪婪相匹配并证明它不会创建不太理想的解决方案到最佳给定。然后继续进行k-i迭代,直到整个解决方案类似。
在尝试失败后,我尝试了相同的想法,只有每个坐标假设ij坐标是第一个不匹配且再次失败的坐标。
然后我尝试了一种不同的方法,假设我在贪婪中有一组步骤并交换算法的整个步骤(这与第一步基本上是相同的想法),但我仍然无法找到方法我保证不会创建一个不太理想的解决方案。
提前感谢任何帮助。
答案 0 :(得分:2)
考虑一些输入r
和c
以及满足它们的矩阵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)
}。因此,贪婪算法将为后一组A[n-1, j] = 1
设置j
,并为j
设置其他c(j)-a(j) = 1
。但是因为我们知道有一个令人满意的解决方案,所以j
在c(j) - a(j) == 1
行之后填充n-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-k
行之后,必须是
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
1>