Сколько способов замостить сетку 2xN запрещенными позициями костяшками домино 2x1 и 1x2?

Мне очень хотелось узнать алгоритм решения этой задачи. Формальное описание постановки задачи выглядит примерно так: Имея N(‹100) и костяшки домино 2x1 и 1x2, я должен найти количество различных возможных замощений сетки. Разница здесь в том, что некоторые ячейки будут зачернены, чтобы обозначить запрещенную позицию.

Input:
5
01000
00010

Output:
1

0 во входных данных представляет собой пустую ячейку и 1 запрещенную ячейку. Я нашел аналогичный вопрос здесь Разбиение на шестиугольные сетки . Хотя было небольшое упоминание о решении таких проблем с помощью динамического программирования с битовыми масками, я не смог найти подробного объяснения этой техники.

PS: Хотя я знаю, как решить общую задачу разбиения сетки, скажем, в этой задаче, только если нам даны только пустые ячейки, тогда повторение может быть сформировано как F (n) = F (n-1) + F (n- 2), поместив костяшку 1x2 или две костяшки 2x1, чтобы закрыть первый и первые два столбца соответственно. Это можно решить итеративно или даже для больших N (скажем,> 10 ^ 7), мы можем использовать метод матричного возведения в степень. Но мне интересно узнать о технике решения подобных проблем с помощью DP+Bitmasks. Любая помощь будет оценена по достоинству.


person Aditya Bahuguna    schedule 22.01.2015    source источник
comment
Интересная проблема, но я думаю, что это было бы более уместно на одном из математических сайтов в сети stackexchange.   -  person Michael Anderson    schedule 22.01.2015
comment
Я подожду, и если я не увижу, что получу ответ, я обязательно опубликую его там. Однако я чувствую, что аспект динамического программирования, который меня здесь интересует, больше относится к SO. Даже количество тегов для DP составляет 1362 ››, что и в Math SE (89) :)   -  person Aditya Bahuguna    schedule 22.01.2015
comment
Эта конкретная проблема может быть решена за полиномиальное время для произвольных сеток с использованием FKT.   -  person David Eisenstat    schedule 22.01.2015


Ответы (1)


Для i = n, n-1, ..., 1 вы вычисляете f00 (i) = «Количество комбинаций для заполнения из столбца i, если столбец i содержит 0,0», f01 (i) = «Количество комбинаций для заполнения из столбца i, если столбец i содержит 0,1", f10 (i) = "Количество комбинаций для заполнения из столбца i, если столбец i содержит 1,0", f11 (i) = "Количество комбинаций для заполнения из столбца i, если столбец я содержал 1,1"

Очевидно, что f00 (n) = f11 (n) = 1, f01 (n) = f10 (n) = 0.

f00 (i) если i ‹ n: вы можете использовать одну вертикальную плитку, которая находится в следующем столбце, или две горизонтальные плитки, если следующий столбец (0, 0). Итак, если следующий столбец равен (0, 0), то результат равен f00 (i + 1) + f11 (i + 1); если следующий столбец равен (0, 1), (1, 0) или (1, 1), то f00 (i) = f01, f10 или f11 (i + 1).

f10 (i) для i ‹ n: Вы должны использовать одну горизонтальную плитку. Если следующий столбец содержит (0, 1) или (1, 1), то результат равен 0; если следующий столбец содержит (0, 0) или (1, 0), то результатом будет f01 (i+1) или f11 (i+1).

f01 (i) работает так же.

f11 (i) = f00, f01, f10 или f11 (i + 1) в зависимости от того, что находится в следующем столбце.

Решение легко находится за линейное время.

person gnasher729    schedule 22.01.2015
comment
f10(i) для i ‹ n: Разве не должно быть f10(i) = f00(i+1) + f10(i+1) ? - person Aditya Bahuguna; 22.01.2015