Розглянемо наступне твердження проблеми:
Давши початкове число, ви з вашим другом по черзі віднімаєте з нього ідеальний квадрат. Перший, який потрапив до нуля, виграє. Наприклад:
Початковий стан: 37
Гравець1 віднімає 16. Стан: 21
Гравець2 віднімає 8. Стан: 13
Гравець1 віднімає 4. Стан: 9
Гравець2 віднімає 9. Стан: 0
Player2 перемагає!
Написати програму, яка задала початковий стан, повертає оптимальний хід, тобто той, який гарантовано призведе до виграшу гри. Якщо жоден можливий хід може привести вас до виграшного стану, поверніться -1.
Цю проблему можна вирішити в псевдополіномічний час за допомогою динамічного програмування. Ідея полягає лише у заповненні масиву довжиною n (де n - початковий стан) знизу вгору оптимальними рухами, або -1, якщо жоден хід не призводить до виграшу. Це займе O (n * sqrt (n)), оскільки для кожного числа нам слід врахувати віднімання кожного можливого досконалого квадрата, меншого за нього (їх ~ sqrt (n)). Однак це складність виконання псевдополінома, оскільки час виконання фактично масштабується в експоненціальному відношенні до розміру вхідних даних у двійковій формі (# біт, що використовується для представлення числа).
Чи може хтось придумати поліноміальний алгоритм вирішення цієї проблеми? Якщо ні, то чи може це бути NP-Complete? Чому?