Considere a seguinte declaração do problema:
Dado um número inicial, você e seu amigo se revezam para subtrair um quadrado perfeito dele. O primeiro a chegar a zero vitórias. Por exemplo:
Estado inicial: 37
Jogador1 subtrai 16. Estado: 21
Jogador2 subtrai 8. Estado: 13
Jogador1 subtrai 4. Estado: 9
Jogador2 subtrai 9. Estado: 0
Jogador2 vence!
Escreva um programa que, dado um estado inicial, retorne uma jogada ideal, ou seja, um que garanta a vitória no jogo. Se nenhuma jogada possível puder levá-lo a um estado vencedor, retorne -1.
Esse problema pode ser resolvido em tempo pseudo-polinomial usando programação dinâmica. A idéia é apenas preencher uma matriz de comprimento n (onde n é o estado inicial) de baixo para cima com os movimentos ideais, ou -1 se nenhum movimento levar à vitória. Isso levaria O (n * sqrt (n)), já que para cada número precisamos subtrair cada quadrado perfeito possível menor que ele (existem ~ sqrt (n) deles). No entanto, essa é uma complexidade de tempo de execução pseudo-polinomial, pois o tempo de execução é escalonado exponencialmente em relação ao tamanho da entrada em binário (número de bits usado para representar o número).
Alguém pode pensar em um algoritmo polinomial para resolver esse problema? Caso contrário, poderia ser NP-Complete? Por quê?