给定一个二维数组,例如:
-----------------------
| | 1 | 2 | 3 | 4 | 5 |
|-------------------|---|
| 1 | X | X | O | O | X |
|-------------------|---|
| 2 | O | O | O | X | X |
|-------------------|---|
| 3 | X | X | O | X | X |
|-------------------|---|
| 4 | X | X | O | X | X |
-----------------------
我必须找到当前包含O
的最大单元格集,每行最多一个单元格,每列一个单元格。
例如,在前面的示例中,最佳答案是 3,当:
- 第 1 行与第 4 列一起;
- 第 2 行与第 1 列(或第 2 列)一起使用;
- 第 3 行(或第 4 行)与第 3 列一起使用。
看来我必须找到一个算法O(CR)
(C
列R
数和行数在哪里)。
我的第一个想法是根据儿子的编号按升序对行进行排序。下面是算法的样子:
For i From 0 To R
For j From 0 To N
If compatible(i, j)
add(a[j], i)
Sort a according to a[j].size
result = 0
For i From 0 To N
For j From 0 to a[i].size
if used[a[i][j]] = false
used[a[i][j]] = true
result = result + 1
break
Print result
尽管我没有找到任何反例,但我不知道它是否总是给出最佳答案。
这个算法正确吗?有没有更好的解决方案?