Potrebbe essere un problema NP-completo?


10

Considera la seguente dichiarazione del problema:

Dato un numero iniziale, tu e il tuo amico vi alternate per sottrarre un quadrato perfetto da esso. Vince il primo a raggiungere lo zero. Per esempio:

Stato iniziale: 37

Il giocatore 1 sottrae 16. Stato: 21

Player2 sottrae 8. Stato: 13

Il giocatore 1 sottrae 4. Stato: 9

Il giocatore 2 sottrae 9. Stato: 0

Player2 vince!

Scrivi un programma che, dato uno stato iniziale, restituisca una mossa ottimale, ovvero una mossa che garantisca la vittoria del gioco. Se nessuna mossa possibile può portarti a uno stato vincente, ritorna -1.

Questo problema può essere risolto in tempi pseudo-polinomiali usando la programmazione dinamica. L'idea è semplicemente riempire un array di lunghezza n (dove n è lo stato iniziale) dal basso verso l'alto con le mosse ottimali, o -1 se nessuna mossa porta alla vittoria. Questo richiederebbe O (n * sqrt (n)) poiché per ogni numero dobbiamo considerare di sottrarre ogni possibile quadrato perfetto più piccolo di esso (ce ne sono ~ sqrt (n)). Tuttavia, si tratta di una complessità di runtime pseudo-polinomiale poiché il runtime si ridimensiona in modo esponenziale in relazione alla dimensione dell'input in binario (numero di bit utilizzati per rappresentare il numero).

Qualcuno può pensare a un algoritmo polinomiale per risolvere questo problema? In caso contrario, potrebbe essere NP-Complete? Perché?


1
Per curiosità, perché stai chiedendo in particolare se è NP-completo? (Personalmente, avrei indovinato che non è nemmeno a NP, anche se davvero non lo so.)
ruakh

@ruakh Di recente ho riscontrato questo problema durante un'intervista di programmazione e ho proposto la soluzione pseudo-polinomiale usando la programmazione dinamica che ho descritto. Tuttavia, dopo aver attentamente pensato al problema non sono riuscito a trovare un algoritmo temporale polinomiale. Presto ho iniziato a chiedermi se questo non fosse in realtà un problema NP (-Complete).
Martin affronta il

Hai provato a calcolare quali posizioni stanno conquistando posizioni e quali stanno perdendo posizioni? Forse sorgerà uno schema.
Yuval Filmus,

@YuvalFilmus Secondo Wikipedia non esiste una formula nota per questo schema (sequenza A030193 nell'OEIS)
Martin Copes,

Bene, stavo solo per pubblicare una risposta con queste informazioni. Vedi anche A224839.
Yuval Filmus,

Risposte:


6

La sequenza di posizioni in perdita si trova nell'OEIS, A030193 , così come la sequenza di posizioni con valore Grundy 1, A224839 . L'enciclopedia cita numerosi articoli pertinenti. Forse alcuni di loro discutono algoritmi non banali per calcolare la sequenza.


Come hai detto, questa sequenza rappresenta le posizioni perdenti. Anche se sei stato in grado di verificare in tempo costante se una posizione perde o meno (il che sembra difficile!) Il problema ti chiede comunque di restituire la mossa ottimale, ovvero quale quadrato dovresti sottrarre allo stato corrente per arrivare a una posizione perdente. Il problema si ridurrebbe alla ricerca di una posizione perdente sottraendo i quadrati dallo stato attuale. Quindi è ancora necessario scorrere tutti i quadrati più piccoli dello stato, anche se è possibile verificare se una posizione sta perdendo in tempo costante.
Martin affronta il

3
Giusto, non sarà abbastanza, ma sarà un buon inizio. Forse otterrai alcune informazioni sulla possibilità di calcolare solo lo stato vincente di una posizione. Inoltre, dimostrare che è difficile decidere quale posizione sta perdendo sarà sufficiente per dimostrare che il problema, come affermato, è NP-difficile, in qualsiasi versione di decisione ragionevole.
Yuval Filmus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.