Betrachten Sie die folgende Problemstellung:
Bei einer Anfangszahl ziehen Sie und Ihr Freund abwechselnd ein perfektes Quadrat davon ab. Der erste, der auf Null kommt, gewinnt. Zum Beispiel:
Ausgangszustand: 37
Spieler1 subtrahiert 16. Status: 21
Spieler2 subtrahiert 8. Status: 13
Spieler1 subtrahiert 4. Status: 9
Spieler2 subtrahiert 9. Status: 0
Spieler2 gewinnt!
Schreiben Sie ein Programm, das bei einem Anfangszustand einen optimalen Zug zurückgibt, dh einen, der garantiert zum Gewinn des Spiels führt. Wenn kein möglicher Zug Sie in einen Gewinnzustand führen kann, geben Sie -1 zurück.
Dieses Problem kann in pseudopolynomialer Zeit durch dynamische Programmierung gelöst werden . Die Idee ist nur, ein Array der Länge n (wobei n der Anfangszustand ist) von unten nach oben mit den optimalen Zügen zu füllen , oder -1, wenn kein Zug zum Gewinnen führt. Dies würde O (n * sqrt (n)) erfordern, da wir für jede Zahl in Betracht ziehen müssen, jedes mögliche perfekte Quadrat zu subtrahieren, das kleiner als es ist (es gibt ~ sqrt (n) von ihnen). Dies ist jedoch eine pseudopolynomielle Laufzeitkomplexität, da die Laufzeit tatsächlich exponentiell in Bezug auf die Größe der Eingabe in Binärform skaliert (Anzahl der zur Darstellung der Zahl verwendeten Bits).
Kann sich jemand einen Polynomalgorithmus zur Lösung dieses Problems vorstellen? Wenn nicht, könnte es NP-Complete sein? Warum?
quelle
Antworten:
Die Reihenfolge der Positionsverluste finden Sie im OEIS, A030193 , ebenso wie die Reihenfolge der Positionen mit dem Grundy-Wert 1, A224839 . Die Enzyklopädie zitiert mehrere relevante Artikel. Vielleicht diskutieren einige von ihnen nicht triviale Algorithmen zur Berechnung der Sequenz.
quelle