Eine Frage wurde veröffentlicht am Stack - Überlauf für einen Algorithmus zu fragen , dieses Problem zu lösen:
Ich habe eine Matrix (nenne es A), die nxn ist. Ich möchte eine Teilmenge (nennen wir es B) von Punkten aus Matrix A auswählen. Die Teilmenge besteht aus n Elementen, wobei aus jeder Zeile und aus jeder Spalte von A ein und nur ein Element entnommen wird. Die Ausgabe sollte eine Lösung liefern ( B) so, dass die Summe der Elemente, aus denen B besteht, angesichts dieser Einschränkungen der maximal mögliche Wert ist (z. B. 25 im folgenden Beispiel). Wenn mehrere Instanzen von B gefunden werden (dh verschiedene Lösungen, die dieselbe maximale Summe ergeben), sollte die Lösung für B ausgewählt werden, die das größte minimale Element aufweist.
B könnte auch eine Auswahlmatrix sein, die nxn ist, bei der jedoch nur die n gewünschten Elemente ungleich Null sind.
Zum Beispiel: wenn A =
|5 4 3 2 1| |4 3 2 1 5| |3 2 1 5 4| |2 1 5 4 3| |1 5 4 3 2|
=> B wäre
|5 5 5 5 5|
Ich schlug eine dynamische Programmierlösung vor, von der ich vermute, dass sie so effizient ist wie jede andere Lösung. Ich habe meinen vorgeschlagenen Algorithmus unten kopiert.
- Lassen sei eine quadratische Anordnung von durch Zahlen.
- Lassen bezeichnen das Element von in der
i
dritten Zeile undj
Spalte. - Lassen bezeichnen die optimale Summe nicht überlappender Zahlen für ein quadratisches Subarray von enthält den Schnittpunkt von Zeilen zu und Spalten zu .
Dann wird die optimale Summe nicht überlappender Zahlen bezeichnet S( 1:n , 1:n )
und wie folgt angegeben:
Note that S( i:i, j:j ) is simply Aij.
Das heißt, die optimale Summe für ein quadratisches Array der Größe n
kann bestimmt werden, indem die optimale Summe für jedes der vier Sub-Arrays der Größe separat berechnet n-1
wird und dann die Summe des Sub-Arrays und des Elements maximiert wird, das "weggelassen" wurde ".
S for |# # # #|
|# # # #|
|# # # #|
|# # # #|
Is the best of the sums S for:
|# | | #| |# # # | | # # #|
| # # #| |# # # | |# # # | | # # #|
| # # #| |# # # | |# # # | | # # #|
| # # #| |# # # | | #| |# |
Dies ist ein sehr eleganter Algorithmus, und ich vermute sehr, dass er korrekt ist, aber ich kann keinen Weg finden, um zu beweisen, dass er korrekt ist.
Die Hauptschwierigkeit besteht darin, zu beweisen, dass das Problem eine optimale Unterstruktur aufweist. Ich glaube, wenn die vier möglichen Auswahlmöglichkeiten in jeder Berechnung die einzigen vier Auswahlmöglichkeiten sind, reicht dies aus, um eine optimale Unterstruktur zu zeigen. Das heißt, ich muss beweisen, dass dies:
| # |
| # # #|
| # # #|
| # # #|
Ist keine gültige Lösung, entweder weil es unmöglich ist (dh ein Beweis durch Widerspruch) oder weil diese Möglichkeit bereits durch eine der vier " n-1
quadratischen" Variationen erklärt wird.
Kann jemand auf Fehler in meinem Algorithmus hinweisen oder einen Beweis dafür liefern, dass er wirklich funktioniert?
O(N^3)
wenn es funktioniert hätte, außer es funktioniert nicht. Also puh.