Angenommen, wir erhalten eine Liste von Punkten, deren und y- Koordinaten alle nicht negativ sind. Angenommen, es gibt keine doppelten Punkte. Wir können nur von Punkt (x_i, y_i) zu Punkt (x_j, y_j) gehen, wenn x_i \ le x_j und y_i \ le y_j . Die Frage ist: Angesichts dieser n Punkte, wie viele Punkte können wir maximal erreichen, wenn wir nach der obigen Regel zwei Pfade zeichnen dürfen, die Punkte verbinden? Pfade müssen vom Ursprung ausgehen und können wiederholte Punkte enthalten. (0, 0) ist natürlich nicht in den erreichten Punkten enthalten.
Ein Beispiel: gegeben lautet die Antwort da wir und .
Wenn wir nur einen Pfad zeichnen dürfen, kann ich die Frage leicht durch dynamische Programmierung lösen, die in . Ich sortiere zuerst die Punkte, indem ich x_i + y_i verkleinere . Sei die maximale Anzahl von Münzen, die man von den Münzen bis in der sortierten Liste aufnehmen kann. Dann ist und . Die Antwort lautet dann nur .
Aber ich kann keine Wiederholungsrelation für zwei Pfade finden. Wenn jemand eine Vorstellung von einer solchen Wiederholungsbeziehung hat, würde ich mich freuen zu hören, was sie sind.
Antworten:
Das Problem, angepasst und verallgemeinerte: Bei einem gegebenen endlicher Satz , ausgestattet mit einer Teilordnung , Ketten finden Maximizing . Die Frage bezieht sich auf den Fall, in dem und .S C 1 , C 2 ⊆ S | C 1 ∪ C 2 | S ⊆ R 2 + ( x , y ) ≤ ( z , w ) ⟺ x ≤ z ∧ y ≤ w≤ C1,C2⊆S |C1∪C2| S⊆R2+ (x,y)≤(z,w)⟺x≤z∧y≤w
Naiv könnte man versuchen, die beste Kette in , wobei die beste daran gemessen wird, wie viele unterschiedliche Werte die Komponenten der Kette haben. Leider kann eine Komponente die Schritte der anderen zurückverfolgen, z. B. daher hat dieser Begriff des Besten keine optimale Unterstruktur.( ( 0 , 0 ) , ( 0 , 0 ) ) < ( ( 1 , 0 ) , ( 0 , 0 ) ) < ( ( 2 , 0 ) , ( 0 , 0 ) ) < ( ( 2 , 0 )) , ( 1 , 0 ) ) ,S2
Stattdessen suchen wir nach Ketten in der Menge . Indem wir verlangen, dass die Komponenten gleich oder unvergleichlich sind, verhindern wir das Zurückverfolgen, müssen aber jetzt argumentieren, dass eine der besten Ketten der neuen Anforderung entspricht.T:={(x,y)∣(x,y)∈S2∧x≮y∧y≮x}
Lemma 1 (keine Rückverfolgung). Sei eine Kette und definiere und . Für alle , haben wir , wenn und nur wenn .C 1 : = { x ∣ ( x , yC⊆T C 2 : = { y ∣ ( x , y ) ∈ C } z ∈ S z ∈ C 1 ∩ C 2 ( z , z ) ∈ C.C1:={x∣(x,y)∈C} C2:={y∣(x,y)∈C} z∈S z∈C1∩C2 (z,z)∈C
Beweis. Die if-Richtung ist trivial. In der einzigen Richtung , wenn, für alle existieren derart , daß . Da eine Kette ist, ist . Nehmen Sie symmetrisch an, dass , was impliziert, dass . Wir wissen von der Definition von , die , also , und . x , y ≤ S ( x , z ) , ( zz∈C1∩C2 x,y∈S C ( x , z ) ≤ ( z , y ) ∨ ( z , y ) ≤ ( x , z ) ( x , z ) ≤ ( z , y ) x(x,z),(z,y)∈C C (x,z)≤(z,y)∨(z,y)≤(x,z) (x,z)≤(z,y) T x ≮ z ∧ z ≮ y x = z = y ( z , z ) ∈ Cx≤z≤y T x≮z∧z≮y x=z=y (z,z)∈C
Lemma 2 (Existenz einer eingeschränkten besten Kette). Für alle Ketten existiert eine Kette so dass und .C ⊆ T C 1 ⊆ { x ∣ ( x , y ) ∈ C } ⊆ C 1 ∪ C 2 C 2 ⊆ { y ∣ ( x , y ) ∈ C } ⊆ C 1 ∪ C 2C1,C2⊆S C⊆T C1⊆{x∣(x,y)∈C}⊆C1∪C2 C2⊆{y∣(x,y)∈C}⊆C1∪C2
Beweis (überarbeitet). Wir geben einen Algorithmus zu konstruieren . Definieren Sie der Einfachheit Sentinels so, dass für alle . Sei und .⊥ , ⊤ x < x < ⊤ x ∈ S C ′ 1 : = C 1 ∪ { ⊤ } C ′ 2 : = C 2 ∪ { ⊤ }C ⊥,⊤ ⊥<x<⊤ x∈S C′1:=C1∪{⊤} C′2:=C2∪{⊤}
Initialisieren Sie und und . Eine Invariante ist, dass .x : = ⊥ y : = ⊥ x ≮ y ∧ y ≮ xC:=∅ x:=⊥ y:=⊥ x≮y∧y≮x
Sei das nächste Element von , . Sei das nächste Element von , .C 1 x ' : = inf { z ≤ z ≤ C ' 1 ≤ x < z } y ' C 2 y ' : = inf { w ≤ w ≤ C ' 2 ≤ y < w }x′ C1 x′:=inf{z∣z∈C′1∧x<z} y′ C2 y′:=inf{w∣w∈C′2∧y<w}
Wenn , setze und gehe zu Schritt 9.x′≮y′∧y′≮x′ (x,y):=(x′,y′)
Wenn , setzen Sie und fahren Sie mit Schritt 9 fort.y<x′<y′ (x,y):=(x′,x′)
Wenn , setzen Sie und fahren Sie mit Schritt 9 fort. Beachten Sie, dass impliziert, dass .y≮x′<y′ x:=x′ x<x′∧x≮y x′≮y
Wenn , setzen Sie und fahren Sie mit Schritt 9 fort.x<y′<x′ (x,y):=(y′,y′)
Wenn , setzen Sie und fahren Sie mit Schritt 9 fort. Beachten Sie, dass impliziert, dass .x≮y′<x′ y:=y′ y<y′∧y≮x y′≮x
Dieser Schritt wird nie erreicht, da die Bedingungen für die Schritte 3 bis 7 vollständig sind.
Wenn (äquivalent ), setzen Sie und fahren Sie mit Schritt 2 fort.x≠⊤ y≠⊤ C:=C∪{(x,y)}
Dynamisches Programm. Berechnen Sie für alle wobei wenn wahr ist, und wenn falsch ist. Aus Lemma 1 folgt, dass die Klammerausdrücke die Anzahl der neuen Elemente korrekt zählen. Mit Lemma 2 wird die optimale Lösung für das ursprüngliche Problem gefunden.(x,y)∈T
quelle
Lassen Sie zur sortierten Liste von Punkten.P=p1…pn
Nach Ihrer Wiederholung für einen Pfad müssen Sie zunächst feststellen, welche Punkte von den Pfaden besucht wurden. Andernfalls können Sie nicht richtig zählen. Die zweite Sache ist, dass Sie jetzt vier Möglichkeiten für jeden Punkt haben: Keiner der Pfade darf ihn verwenden, einer von ihnen oder beide. Wir müssen also für alle drei Fälle maximale Kombinationen finden.
Formal sei mit dem Paar von (Sätzen von) besuchten Knoten der beiden Pfade, die die Anzahl der besuchten Punkte von der Eingabe bis zur ten maximieren, wobei die erste Komponente das maximierende , für das die erste , die zweite Komponente für den zweiten Pfad ähnlich ist und die dritte Komponente mit beiden Pfade mit . ist durch die Wiederholung gegebend:[0…n]→(2[n]×2[n])3 d(i) i pi pi d
mit
Das ist natürlich nicht sehr schön. Dies liegt daran, dass sich das Problem nicht sehr gut für die dynamische Programmierung eignet: Sie können nicht viele Teillösungen kombinieren, da es keine schöne Gesamtreihenfolge für die Punkte gibt und Sie Zwischenergebnisse aus demselben Grund nicht verwerfen können.
Eine schönere Sicht auf das Problem besteht darin, die Menge der Punkte als gewichteten gerichteten azyklischen Graphen mit zu modellierenG=(V,E,w)
Beachten Sie, dass Sie das Diagramm kleiner halten können, wenn Sie redundante Kanten entfernen entfernen wenn ein Pfad vorhanden ist , da die Verwendung solcher "Verknüpfungen" niemals besser vorteilhaft ist.(v1,v2) (v1,…,v2)
Für einen Pfad ist die Lösung eindeutig die Länge des längsten Pfades von bis . Wenn wir nun so ändern , dass alle Kanten, die zu Punkten auf auch das Gewicht und den längsten Pfad in diesem modifizierten Graphen berechnen, erhalten wir einen Pfad so dass und zusammen as abdecken viele Punkte wie zwei Pfade können. Dies lässt uns eine Laufzeit in (siehe hier ).P∗ (0,0) (X,Y) w P∗ 0 P+ P∗ P+ O(|V|+|E|)⊆O(n2)
quelle