选择符合此条件的最大行数

时间:2015-08-10 20:38:45

标签: algorithm language-agnostic dynamic-programming

我在编码竞赛中遇到了这个问题,归结为以下问题:

什么是可以从二进制矩阵中选择的最大行数,使得没有两行具有非零的列AND。 (行的所有对应该具有列式和零)。

约束:行< = 50,列< = 20

例如

00101101

10110001

10000010

答案是2,(第一和第三行)。

我可以认为列数存在一些指数算法(因为约束)。我无法达成解决方案。我所有的其他尝试都太复杂了,无法创建图形并找到独立集,而且行数也呈指数级。有人可以帮我解决这个问题吗?

我试图在比赛结束后查看其他参赛者的代码,他们似乎正在用DP解决它。我不是要求完整的解决方案。我很欣赏一些详细的提示。

编辑:

如果描述不清楚,则所选行不应在同一列中具有共同的行(如果它仍然不清楚,请抱歉)。与给定示例中一样,无法选择第一行和第二行,因为它们在第3列和第8列中具有一行。类似地,第二行和第三行不能被选择,因为它们在第一列中具有共同的行。第1和第3行没有常见的一个。

2 个答案:

答案 0 :(得分:1)

这是NP-hard set packing问题。预期的O(m 2 ^ n)时间解决方案(其中m是行数,n是列数,小于字大小)准备一个索引为0..m乘以0..2 ^ n的表-1,其中cell(i,j)是索引为0..i的最大行数,其成对交点/ AND为空/零且其union / OR为j。

答案 1 :(得分:0)

https://en.wikipedia.org/wiki/Set_packing给出了在N个元素的通用集合的给定子集的集合中确定是否存在k个子集的等效问题,使得k个所选子集中没有一个相交。如果决策问题可以在多项式时间内求解,则最大化问题是显而易见的并且可以在多项式时间内求解:最大化问题要求最大k,使得可以找到k个子集,使得k个子集中没有一个相交。

不幸的是,这些问题是NP难的(特别是,特定k的决策问题是NP完全的),所以除非P = NP,否则没有针对您的问题的通用快速解决方案。也许考虑到问题中行和列的数量很少,一个"足够快"可以设计出解决方案。然而,根据我对经典套装问题的初步解读,我们不清楚这种解决方案是如何运作的。