次のような 2 次元配列があるとします。
-----------------------
| | 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 |
-----------------------
行ごとに最大 1 つのセルと列ごとに 1 つのセルを含む、現在含まれている最大のセルのセット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
反例は見つけられませんでしたが、常に最適な答えが得られるかどうかはわかりません。
このアルゴリズムは正しいですか?より良い解決策はありますか?