Игра переворачивать два последовательных положительных результата на отрицательные

Этот вопрос мне задали в одном из интервью. Вопросы звучат так

У вас есть строка из «+» и «-» (например, ++ ---- ++++++ - + - +). Есть два игрока - Игрок 1 и Игрок 2. На каждом ходу один из игроков может выбрать любые два последовательных знака «+», то есть ++, и перевернуть их на -. Итак, если исходная строка - ++ ---- ++++++ - + - +, а затем у игрока есть следующие 6 вариантов (2-7) (первый для справки).

  1. ++----++++++-+--+
  2. ------++++++-+--+
  3. ++------++++-+--+
  4. ++----+--+++-+--+
  5. ++----++--++-+--+
  6. ++----+++--+-+--+
  7. ++----++++---+--+

Игроки ходят по очереди. Игрок, который сделает последний ход, выиграет (или проиграет - не имеет значения).

Учитывая начальную строку и если игрок 1 ходит первым, мы должны сказать, кто победит?

Теперь это похоже на классическую задачу теории игр, когда каждый игрок пытается играть оптимально и на каждом шаге делает ход, который перемещает его в выигрышную позицию.

Любые идеи о том, как я могу подойти к этому, чтобы решить?

PS - Интересует больше подход, чем решение. Я прочитал http://www.codechef.com/wiki/tutorial-game-theory, но здесь нельзя применить ту же логику.


person Harshil Lodhi    schedule 16.12.2014    source источник


Ответы (1)


Здесь мы можем использовать функцию Гранди, потому что после преобразования ++ в - игра делится на сумму двух отдельных игр: слева от - и справа. Предположим, что g (l, r) - значение функции Гранди для интервала [l, r] данной строки. Чтобы вычислить это, мы можем попытаться изменить ++ на - во всех возможных позициях, сохранить все значения g (l, k - 1) x или g (k + 2, r) (где k - позиция, в которой начинается ++) значения и выберите наименьшее неотрицательное целое число, которого нет среди них. Значение для базового случая (когда нет возможных ходов) равно 0 или 1 (в зависимости от того, проигрывает или побеждает последний игрок). Первый игрок выигрывает тогда и только тогда, когда g (0, n - 1) (n - длина входной строки) не равно нулю. Это решение имеет временную сложность O (n ^ 3) (существует O (n ^ 2) возможных (l, r) пар, и мы можем вычислить ответ за линейное время для каждой из них).

person kraskevich    schedule 16.12.2014
comment
Можете ли вы объяснить, почему мы выбираем среди них наименьшее неотрицательное целое число? - person Harshil Lodhi; 01.03.2016