Este poderia ser um problema NP-Complete?


10

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ê?


11
Por curiosidade, por que você está perguntando especificamente se é NP-completo? (Pessoalmente, eu teria imaginado que não é nem mesmo no NP, embora eu realmente não sei.)
— ruach

@ruakh Encontrei recentemente esse problema durante uma entrevista de codificação e propus a solução pseudo-polinomial usando a programação dinâmica que descrevi. No entanto, depois de pensar cuidadosamente sobre o problema, não consegui criar um algoritmo de tempo polinomial. Logo comecei a me questionar se isso não era de fato um problema de NP (-Completo).
— Martin Copes

Você já tentou calcular quais posições estão ganhando e quais estão perdendo? Talvez um padrão surja.
— Yuval Filmus

@YuvalFilmus De acordo com a Wikipedia, não existe uma fórmula conhecida para esse padrão (sequência A030193 no OEIS)
— Martin Copes

Certo, eu estava indo apenas para postar uma resposta com esta informação. Veja também A224839.
— Yuval Filmus

Respostas:


6

A sequência de posições perdidas pode ser encontrada no OEIS, A030193 , assim como a sequência de posições com o valor 1 Grundy , A224839 . A enciclopédia cita vários artigos relevantes. Talvez alguns deles discutam algoritmos não triviais para calcular a sequência.


Como você mencionou, esta sequência representa as posições perdedoras. Mesmo se você fosse capaz de verificar em tempo constante se uma posição perde ou não (o que parece difícil!), O problema ainda pede que você retorne a jogada ideal, ou seja, qual quadrado você precisaria subtrair para o estado atual para chegar ao uma posição perdida. O problema se resumia a encontrar uma posição perdida subtraindo quadrados do estado atual. Portanto, você ainda precisa percorrer todos os quadrados menores que o estado, mesmo se pudesse verificar se uma posição está perdendo em tempo constante.
— Martin Copes

3
Certo, não será suficiente, mas será um bom começo. Talvez você tenha alguma ideia de poder calcular apenas o status de vitória de uma posição. Além disso, mostrar que é difícil decidir qual posição está perdendo será suficiente para mostrar que seu problema, como indicado, é difícil para NP, em qualquer versão de decisão razoável.
— Yuval Filmus
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.