Xem xét các báo cáo vấn đề sau:
Cho một số ban đầu, bạn và bạn của bạn lần lượt trừ đi một hình vuông hoàn hảo từ nó. Người đầu tiên có được chiến thắng bằng không. Ví dụ:
Trạng thái ban đầu: 37
Người chơi1 trừ 16. Bang: 21
Người chơi2 trừ 8. Bang: 13
Player1 trừ 4. Bang: 9
Player2 trừ 9. Trạng thái: 0
Người chơi2 thắng!
Viết chương trình đưa ra trạng thái ban đầu, trả về một nước đi tối ưu, tức là một chương trình được đảm bảo để dẫn đến chiến thắng trò chơi. Nếu không có động thái nào có thể đưa bạn đến trạng thái chiến thắng, hãy trả về -1.
Vấn đề này có thể được giải quyết trong thời gian giả đa thức bằng cách sử dụng lập trình động. Ý tưởng chỉ là lấp đầy một mảng có độ dài n (trong đó n là trạng thái ban đầu) từ dưới lên với các bước di chuyển tối ưu, hoặc -1 nếu không có động thái nào dẫn đến chiến thắng. Điều này sẽ mất O (n * sqrt (n)) vì với mỗi số chúng ta cần xem xét trừ đi mỗi hình vuông hoàn hảo có thể nhỏ hơn nó (có ~ sqrt (n) của chúng). Tuy nhiên, đây là độ phức tạp thời gian chạy giả đa thức vì thời gian chạy thực sự chia tỷ lệ theo cấp số nhân liên quan đến kích thước của đầu vào trong nhị phân (# bit được sử dụng để biểu thị số).
Bất cứ ai cũng có thể nghĩ về một thuật toán đa thức để giải quyết vấn đề này? Nếu không, nó có thể là NP-Complete? Tại sao?