
- •Часть 1. Курс лекций
- •Введение.
- •Цели освоения дисциплины
- •Место дисциплины в структуре ооп впо
- •Компетенции обучающегося, формируемые в результате освоения дисциплины (модуля)
- •Тема 1. Алгоритмы на графах (6 часов).
- •Лекция 1. Начальные понятия теории графов.
- •Определение графа
- •Графы и бинарные отношения
- •Откуда берутся графы
- •Число графов
- •Смежность, инцидентность, степени
- •Некоторые специальные графы
- •Графы и матрицы
- •Взвешенные графы
- •Изоморфизм
- •Инварианты
- •Операции над графами
- •Локальные операции
- •Подграфы
- •Алгебраические операции
- •Лекция 2. Поиск в глубину и ширину. Поиск в ширину
- •Процедура поиска в ширину
- •Процедура поиска в глубину
- •Глубинная нумерация
- •Построение каркаса
- •Шарниры
- •Маршруты, пути, циклы
- •Связность и компоненты
- •Метрические характеристики графов
- •Маршруты и связность в орграфах
- •Эйлеровы пути и циклы
- •Построение эйлерова цикла
- •Гамильтоновы пути и циклы
- •Тема 2. Алгоритмы комбинаторного перебора (6 часов).
- •Размещения с повторениями
- •Перестановки
- •Подмножества
- •Разбиения
- •Лекция 5. Коды Грея. Коды Грея и аналогичные задачи
- •Лекция 6. Применение методов комбинаторного перебора.
- •Подсчет количеств
- •Тема 3. Общие методы разработки алгоритмов (6 часов).
- •Ферзи, не бьющие друг друга: обход дерева позиций
- •Лекция 8. Рекурсия. Примеры рекурсивных программ
- •Рекурсивная обработка деревьев
- •Лекция 9. Построение итеративных алгоритмов по рекурсивным.
- •Стек отложенных заданий
- •Более сложные случаи рекурсии
- •Библиографический список
- •Содержание
- •Тема 1. Алгоритмы на графах. 6
- •Тема 2. Алгоритмы комбинаторного перебора. 48
- •Тема 3. Общие методы разработки алгоритмов. 66
- •Шутов Антон Владимирович Медведев Юрий Алексеевич
- •600014, Г. Владимир, ул. Университетская, 2, тел. 33-87-40
Подсчет количеств
Иногда
можно найти количество объектов с тем
или иным свойством, не перечисляя их.
Классический пример:
-
число всех
-элементных
подмножеств
-элементного
множества - можно найти, заполняя таблицу
по формулам
или по формуле
(Первый способ эффективнее, если надо вычислить много значений .)
Приведем другие примеры.
Число
разбиений; предлагалась на Всесоюзной
олимпиаде по программированию 1988 года.
Пусть
-
число разбиений целого положительного
на
целые положительные слагаемые (без
учета порядка,
и
-
одно и то же разбиение). При
положим
(единственное
разбиение не содержит слагаемых).
Построить алгоритм вычисления
для
заданного
.
Решение. Можно доказать (это нетривиально) такую формулу для :
(знаки у пар членов чередуются, вычитаемые
в одной паре равны
и
;
сумма конечна - мы считаем, что
при
).
Однако и без ее использования можно придумать способ вычисления , который существенно эффективнее перебора и подсчета всех разбиений.
Обозначим
через
(для
,
)
число разбиений
на
целые положительные слагаемые, не
превосходящие
.
(При этом
считаем
равным
для
всех
.)
Очевидно,
.
Все разбиения
на
слагаемые, не превосходящие
,
разобьем на группы в зависимости от
максимального слагаемого (обозначим
его
).
Число
равно
сумме (по всем
от
до
)
количеств разбиений со слагаемыми не
больше
и
максимальным слагаемым, равным
.
А разбиения
на
слагаемые не более
с
первым слагаемым, равным
,
по существу представляют собой разбиения
на
слагаемые, не превосходящие
(при
).
Так что
что позволяет заполнять таблицу значений
функции
.
Счастливые
билеты; предлагалась на Всесоюзной
олимпиаде по программированию 1989 года.
Последовательность из
цифр
(каждая цифра от
до
)
называется счастливым билетом, если
сумма первых
цифр
равна сумме последних
цифр.
Найти число счастливых последовательностей
данной длины.
Решение.
(Сообщено одним из участников олимпиады;
к сожалению, не могу указать фамилию,
так как работы проверялись зашифрованными.)
Рассмотрим более общую задачу: найти
число последовательностей, где разница
между суммой первых
цифр
и суммой последних
цифр
равна
(
).
Пусть
-
число таких последовательностей.
Разобьем
множество таких последовательностей
на классы в зависимости от разницы между
первой и последней цифрами. Если эта
разница равна
,
то разница между суммами групп из
оставшихся
цифр
равна
.
Учитывая, что пар цифр с разностью
бывает
,
получаем формулу
(Некоторые слагаемые могут отсутствовать, так как может быть слишком велико.)
В некоторых случаях ответ удается получить в виде явной формулы.
Доказать,
что число
Каталана
(количество последовательностей длины
из
единиц
и
минус
единиц, в любом начальном отрезке которых
не меньше единиц, чем минус единиц) равно
.
Указание.
Число
Каталана
есть число ломаных, идущих из
в
шагами
и
,
не опускающихся в нижнюю полуплоскость,
т.е. разность числа всех ломаных (которое
есть
)
и числа ломаных, опускающихся в нижнюю
полуплоскость. Последние можно описать
также как ломаные, пересекающие прямую
.
Отразив их кусок справа от самой правой
точки пересечения
относительно указанной прямой, мы
установим взаимно однозначное соответствие
между ними и ломаными из
в
.
Остается проверить, что
.