2013-09-23 3 views
5

Я пытаюсь научить себя динамическому программированию и столкнулся с этой проблемой от MIT.Pebbling Шахматная доска с динамическим программированием

Нам дана шахматная доска, которая имеет 4 строки и n столбцов, а имеет целое число, записанное на каждом квадрате. Нам также дают набор из 2n гальки, и мы хотим разместить некоторые или все из них на шахматной доске (каждая галька может быть размещена ровно на один квадрат) , чтобы максимизировать сумму целых чисел в квадратах, которые покрытый галькой. Существует одно ограничение: для размещения гальки должно быть законным, никакие два из них не могут быть горизонтально или вертикально смежных квадратов (диагональная смежность в порядке).

(a) Определите количество юридических шаблонов, которые могут возникать в любом столбце (изолированно, игнорируя гальки в соседних столбцах) и описывайте эти шаблоны. Вызовите два шаблона совместимыми, если их можно разместить на соседних столбцах, чтобы сформировать юридическое размещение. Рассмотрим подзадачи, состоящие из первых k столбцов 1 k n. Каждой подзадаче может быть присвоен тип , который является шаблоном, имеющим место в последнем столбце.

(b) Используя понятия совместимости и типа, дайте алгоритм динамического программирования O (n) -time для вычисления оптимального размещения.

Хорошо, поэтому для части a: существует 8 возможных решений.

Для части b, я не уверен, но это - то, куда я направляюсь: SPlit в под-проблемы. Предположим, что i в n. 1. Определите Cj [i] как оптимальное значение, делясь столбцами 0, ..., i, так что столбец i имеет тип шаблона j. 2. Создайте 8 отдельных массивов из n элементов для каждого типа шаблона.

Я не уверен, куда идти отсюда. Я понимаю, что есть решения этой проблемы в Интернете, но решения мне кажутся не очень ясными.

+0

Я вижу только 7 возможных решений для части а вы можете объяснить все 8 возможных решений? – akashchandrakar

+0

Правовые положения о колонках: [- | - | - | -]; [X | - | - | -]; [- | X | - | -]; [- | - | X | -]; [- | - | - | X]; [X | - | X | -]; [X | - | - | X]; [- | X | - | X] (отвечает за полноту ради) – Sosavpm

ответ

3

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

Допустим, вы создали свой список совместимости (2D-массив) и назвал его L я [у], что для каждого шаблона я есть один или несколько совместимых моделей L я [у ].

Теперь вы изучите колонку j. Сначала вы вычисляете изолированные оценки столбца для каждого шаблона i. Звоните S j [i]. Для каждого шаблона я и совместимо шаблон х = L я [у], необходимо максимизировать общий балл C J таким образом, что С J [х] = С J- 1 [i] + S j [x]. Это простой тест массива и обновление (если оно больше).

Кроме того, вы храните шаблон гальки, который привел к каждому результату. При обновлении C J [х] (т.е. вы увеличить свой счет от ее текущей стоимости), то помните, начальные и последующие образцы, которые вызвали обновление, как P J [х] = я. Это говорит о том, что «шаблон x дал лучший результат, учитывая предыдущий шаблон i».

Когда вы все сделали, просто найти шаблон я с лучшей оценкой C п [я]. Затем вы можете вернуться с помощью P j, чтобы восстановить шаблон гальки из каждого столбца, который привел к такому результату.

+0

Спасибо за вашу помощь. Как выглядит этот массив совместимости? – user2767074

+1

@ user2767074: Вам нужно построить его один раз на этапе предварительной обработки, протестировав каждый шаблон по любому другому шаблону. В качестве альтернативы вы можете использовать двумерный массив бит 8x8 или логические значения - это было бы быстрее для таких запросов, как «Может ли шаблон x следовать шаблону y?», И алгоритм может быть оптимизирован для использования таких запросов, но запросы, которые он наиболее естественно использует «Каков набор шаблонов, которые могут следовать шаблону y?», и для этого быстрее использовать массив списков допустимых шаблонов. –

+1

Я не учитывал детали реализации, чтобы не загромождать свой ответ. Я предусмотрел каждую строку в массиве, содержащую совместимый индекс шаблона, используя значение дозорности (например, -1), чтобы отметить конец строки. Вместо этого вы можете использовать 0 для обозначения конца списка (если 0 - ваш шаблон с нулевой галькой), потому что каждый шаблон совместим с этим. Если хотите, вы можете сгенерировать это на бумаге. – paddy

Смежные вопросы