Изменения

Перейти к: навигация, поиск

Динамическое программирование по профилю

132 байта добавлено, 21:49, 14 января 2015
Пример
== Пример ==
Еще раз используем в качестве примера задачу о замощении. Базовая линия теперь будет ломаной: при прохождении через <tex>i</tex>-ю горизонталь сверху вниз, она переходит на предыдущую вертикаль и спускается до низу.Теперь профиль — это не только маска, но ещё и место излома. [[Файл:img35.gif]]
Профилем будет пара <tex>(p, i)</tex>, в <tex>p</tex> будет информация о <tex>n + 1</tex> маленьком квадратике слева от базовой линии, имеющем с ней общие точки; <tex>i</tex> обозначает номер горизонтали, на которой произошел излом. Квадратики профиля будут нумероваться сверху вниз, так что угловой будет иметь номер <tex>i + 1</tex>. Горизонтали будем нумеровать с нуля, так что <tex>i</tex> пробегает значения от <tex>0</tex> до <tex>n - 1</tex>.
<font color=green>// Функция bit(x,i), возвращающая единицу или ноль или i-й бит в двоичной записи числа x</font>
'''print_all_links'''(<tex>p</tex>, <tex>i</tex>):
'''if''' <tex>\mathtt{bit}(\mathtt{p, i + 1}) == \mathtt{0}</tex> '''if''' <tex>i == n - 1</tex> '''println''' <tex>((p - (2 << i)) << 1</tex>, " ", <tex>0)</tex>
'''else'''
'''println''' <tex>(p - (2 << i)</tex>, " ", <tex>i + 1)</tex>
'''else'''
'''if''' <tex>\mathtt{bit}(\mathtt{p, i}) = \mathtt{0}</tex>
'''if''' <tex>i == n - 1 </tex> '''println''' <tex>((p<< 1)</tex>, " ", <tex>0)</tex>
'''else'''
'''println''' <tex>(p + (1 << i)</tex>, " ", <tex>(i + 1) % n)</tex> '''if''' <tex>i < n - 1</tex> && <tex>\mathtt{bit}(\mathtt{p, i + 2}) == \mathtt{0}</tex> '''println''' <tex>(p + (4 << i)</tex>, " ", <tex>i + 1)</tex>
При такой реализации существует немало профилей только с одним переходом (например, у которых <tex>(i + 1)</tex>-й бит равен единице).
Анонимный участник

Навигация