Чи може це бути неповною проблемою?


10

Розглянемо наступне твердження проблеми:

Давши початкове число, ви з вашим другом по черзі віднімаєте з нього ідеальний квадрат. Перший, який потрапив до нуля, виграє. Наприклад:

Початковий стан: 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? Чому?


1
З цікавості, чому ви конкретно запитуєте, чи не завершено це NP? (Особисто я би здогадався, що це навіть не в НП, хоча я насправді не знаю.)
ruakh

@ruakh Я нещодавно зіткнувся з цією проблемою під час інтерв'ю з кодуванням і запропонував рішення псевдополінома, використовуючи динамічне програмування, яке я описав. Однак, ретельно продумавши проблему, я не міг придумати поліноміальний алгоритм часу. Я незабаром почав розпитувати себе, чи це насправді не проблема НП (-комплект).
Мартін Коупс

Ви спробували підрахувати, які позиції - це виграшні позиції, а які - програючі? Можливо, виникне закономірність.
Yuval Filmus

@YuvalFilmus За даними Вікіпедії, не існує відомої формули цього шаблону (послідовність A030193 в OEIS)
Martin Copes

Правильно, я просто збирався розмістити відповідь з цією інформацією. Дивіться також A224839.
Yuval Filmus

Відповіді:


6

Послідовність втрачених позицій можна знайти в OEIS, A030193 , як і послідовність позицій, що мають значення Grundy 1, A224839 . Енциклопедія цитує кілька відповідних статей. Можливо, деякі з них обговорюють нетривіальні алгоритми обчислення послідовності.


Як ви вже згадували, ця послідовність являє програшні позиції. Навіть якщо ви змогли постійно перевіряти, втрачає чи ні позиція (що здається важким!), Проблема все ж просить повернути оптимальний хід, тобто який квадрат вам потрібно буде відняти до поточного стану, щоб дістатися до втрачаюче становище. Проблема зводиться до пошуку втраченої позиції шляхом віднімання квадратів від поточного стану. Тож вам все одно потрібно повторити всі квадрати, менші за стан, навіть якщо ви могли перевірити, чи втрачається позиція за постійний час.
Мартін Коупс

3
Правильно, цього буде недостатньо, але це буде хороший початок. Можливо, ви отримаєте деяке уявлення про те, що зможете розрахувати лише статус виграшу позиції. Плюс того, що показати, що важко визначити, яку позицію втрачає, буде достатньо, щоб показати, що ваша проблема, як заявлено, є важкою для будь-якого варіанту рішення.
Yuval Filmus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.