Теоретический материал
Задача о расстановке коней
На этот раз на шахматной доске n×n нужно подсчитать количество способов расставить k коней так, чтобы они не били друг друга.
Мы уже привыкли, что профиль -- битовая карта столбца левее bi. Но здесь этой информации мало, так как кони могут прыгать сразу через два столбца. Поэтому профиль должен описывать два соседних столбца.
Для двух профилей
pr1 = p1, p2
(p1 -- битовая карта первого столбца, p2 -- второго) и
pr2 =
p'1, p'2
положим
d[pr1, pr2] = 1 если и только если
- a)
- p2 = p'1;
- б)
- кони не бьют друг друга.
В противном случае d[pr1, pr2] = 0.
Таким образом, переходов на порядок меньше, чем количество профилей. Всего профилей 4n, а из каждого профиля получается менее 2n новых за счет совпадения p2 и p1'. Другими словами, матрица D сильно разрежена (имееет много нулевых элементов).
Поэтому в задаче о расстановки коней можно добиться значительного ускорения (по сравнению с шаблонным алгоритмом), если хранить D в виде "списков смежности": D'[pr1] -- список всех таких pr2, из которых можно получить pr1, то есть d[pr2][pr1] = 1. В этом случае формула (2) будет выглядеть так:
![$\displaystyle \sum_{t \in D'[p]}^{}$](http://informatics.mccme.ru/moodle/file.php/9/dyn_prof/img33.gif)
Суммарное время вычисления a[i] равно количеству всевозможных переходов, то есть количество ненулевых элементов в D. В нашем случае (задаче о конях) их не более 4n×2n = 8n, то есть время работы алгоритма с такой оптимизацией будет O(8nm) -- это в 2n раз меньше, чем время стандартного алгоритма.