다음 문제점 설명을 고려하십시오.
초기 숫자가 주어지면, 당신과 당신의 친구는 교대로 완벽한 정사각형을 뺍니다. 제로에 도착하는 첫 번째 승리. 예를 들면 다음과 같습니다.
초기 상태 : 37
플레이어 1 빼기 16. 상태 : 21
플레이어 2 빼기 8. 상태 : 13
플레이어 1 빼기 4. 상태 : 9
플레이어 2 빼기 9. 상태 : 0
Player2가 승리합니다!
초기 상태를 제공하고 최적의 움직임, 즉 게임에서 승리하도록 보장되는 움직임을 반환하는 프로그램을 작성하십시오. 가능한 이동으로 승리 상태가 될 수 없으면 -1을 반환하십시오.
이 문제는 동적 프로그래밍을 사용하여 의사 다항식 시간 으로 해결할 수 있습니다 . 아이디어는 최적의 이동 으로 길이 n (여기서 n 은 초기 상태) 의 배열을 채우 거나 이동이 없으면 승리 -1을 채우는 것입니다 . 모든 숫자에 대해 가능한 모든 완벽한 제곱을 빼는 것을 고려해야하기 때문에 O (n * sqrt (n))이 필요합니다 (~ sqrt (n)). 그러나 런타임은 실제로 2 진 (입력을 나타내는 데 사용되는 비트 수)의 입력 크기와 관련하여 지수 적으로 확장되므로 의사 다항식 런타임 복잡성입니다.
누구나이 문제를 해결하기위한 다항식 알고리즘을 생각할 수 있습니까? 그렇지 않다면 NP-Complete 일 수 있습니까? 왜?