Pertimbangkan pernyataan masalah berikut:
Diberi nomor awal, Anda dan teman Anda bergantian mengurangi kuadrat sempurna darinya. Yang pertama mencapai nol menang. Sebagai contoh:
Status awal: 37
Pemain1 mengurangi 16. Negara: 21
Player2 kurangi 8. Status: 13
Pemain1 mengurangi 4. Negara: 9
Player2 kurangi 9. Status: 0
Player2 menang!
Tulis program yang diberi status awal, kembalikan langkah yang optimal, yaitu program yang dijamin memimpin untuk memenangkan permainan. Jika tidak ada gerakan yang mungkin dapat membawa Anda ke keadaan menang, kembalikan -1.
Masalah ini dapat diselesaikan dalam waktu semu-polinomial menggunakan pemrograman dinamis. Idenya hanya mengisi array panjang n (di mana n adalah keadaan awal) bottom up dengan gerakan optimal, atau -1 jika tidak ada gerakan mengarah ke kemenangan. Ini akan membutuhkan O (n * sqrt (n)) karena untuk setiap angka kita perlu mempertimbangkan mengurangi setiap kuadrat sempurna yang mungkin lebih kecil dari itu (ada ~ sqrt (n) dari mereka). Namun, ini adalah kompleksitas runtime pseudo-polinomial karena runtime sebenarnya menskala secara eksponensial dengan kaitannya dengan ukuran input dalam biner (# bit yang digunakan untuk mewakili angka).
Adakah yang bisa memikirkan algoritma polinomial untuk memecahkan masalah ini? Jika tidak, mungkinkah NP-Complete? Mengapa?
sumber
Jawaban:
Urutan posisi yang hilang dapat ditemukan di OEIS, A030193 , seperti urutan posisi yang memiliki nilai Grundy 1, A224839 . Ensiklopedia tersebut mengutip beberapa artikel yang relevan. Mungkin beberapa dari mereka membahas algoritma non-sepele untuk menghitung urutannya.
sumber