Wir haben ein -Gitter. Wir haben eine Sammlung von Rechtecken auf diesem Gitter, jedes Rechteck kann als eine mal- -binäre Matrix . Wir wollen das Gitter mit diesen Rechtecken abdecken.
Deckt die Entscheidungsversion dieses Sets das Problem NP-complete ab?
- Eingabe: Sammlung von Rechtecken im Raster (Eingabegröße: ) und
- Ausgabe: wobei und für jede Zelle mindestens ein Rechteck enthalten, das sie abdeckt.
Ich fand heraus, dass der 1D-Fall ( ) durch dynamische Programmierung in Polynomzeit gelöst werden kann: Jede optimale Abdeckung wird die Vereinigung von sein
- eine optimale Abdeckung für einige Unterprobleme der Abdeckung der ersten -Zellen.
- ein 1D-Rechteck, dh ein Intervall, das die verbleibenden Zellen abdeckt .
Ich glaube jedoch nicht, dass DP für das 2D-Problem funktionieren kann: Für das 1D-Problem müssen Sie Unterprobleme lösen, aber für 2D haben Sie -Unterprobleme (Anzahl der Nordost-Probleme) Gitterpfade auf dem Gitter).
Ich denke, das Problem könnte NP sein, aber ich bin nicht sicher (obwohl es schwieriger zu sein scheint als P), und es ist mir nicht gelungen, eine Polynomreduktion von einem NP-vollständigen Problem (3-SAT, Vertex Cover, ...) zu finden.
Jede Hilfe oder jeder Hinweis ist willkommen.
|=
=|
Antworten:
Dank des Hinweises von j_random_hacker habe ich eine Lösung gefunden, um Vertex Cover auf das Gitterproblem zu reduzieren:
Wir machen ein -by- | V | Gitter von 3 mal 3 Blöcken, dh ein 3 | E | -by- 3 | V | Gitter mit Ecken, die als Spalten geordnet sind { v 1 , … , v N 1 } und Kanten, die als Zeilen geordnet sind { e 1 , … , e N 2 } . Wir werden Rechtecke auf diesem Gitter konstruieren (die Zeichnung unten hilft dabei, die verschiedenen verwendeten Rechtecke besser zu verstehen).|E| |V| 3|E| 3|V| {v1,…,vN1} {e1,…,eN2}
Also haben wir|E||V| Rechtecke vom Typ 2, diese Rechtecke müssen ausgewählt werden, da sie jeweils die einzige Abdeckung für die obere linke (oder obere rechte) Ecke des Blocks darstellen, in dem sie sich befinden.
Wie wir gesagt haben, entspricht jede Kante einer Zeile, wobei zwei Blöcke (nennen wir sie Endblöcke) den Endpunkten der Eckpunkte und ( e i , v b ) entsprechen . Jetzt haben wir Rechtecke vom Typ 3:(ei,va) (ei,vb)
Nun konstruieren wir für jede Kante Rechtecke vom Typ 4, zwischen den Endblöcken haben wir zwei Rechtecke für die zweite Reihe:
Um das Raster abzudecken:
Um für eine gegebene Kante den Teil zwischen den noch nicht abgedeckten Kantenendblöcken (zweite und dritte Reihe der Blockreihe) abzudecken, können wir entweder verwenden:
Beachten Sie, dass wir in jedem Fall mindestens zwei Rechtecke vom Typ 4 benötigen.
quelle