Опубликован: 08.04.2009 | Уровень: для всех | Доступ: платный
Лекция 2:

Порождение комбинаторных объектов

< Лекция 1 || Лекция 2: 12345 || Лекция 3 >

2.7. Подсчет количеств

Иногда можно найти количество объектов с тем или иным свойством, не перечисляя их. Классический пример: C_n^k - число всех k -элементных подмножеств n -элементного множества - можно найти, заполняя таблицу по формулам

\begin{alignat*}{2}
    C_n^0 &=C_n^n = 1\qquad                  &&(n \ge 1)\\
    C_n^k &=C_{n-1}^{k-1} + C_{n-1}^k\qquad  &&(n > 1, 0 < k  n)
\end{alignat*}
или по формуле
C_n^k=\frac{n!}{k!\cdot (n-k)!}.
(Первый способ эффективнее, если надо вычислить много значений C_n^k.)

Приведем другие примеры.

2.7.1. (Число разбиений; предлагалась на Всесоюзной олимпиаде по программированию 1988 года) Пусть P(n) - число разбиений целого положительного n на целые положительные слагаемые (без учета порядка, 1+2 и 2+1 - одно и то же разбиение). При n=0 положим P(n) = 1 (единственное разбиение не содержит слагаемых). Построить алгоритм вычисления P(n) для заданного n.

Решение. Можно доказать (это нетривиально) такую формулу для P(n):

P(n) = P(n-1)+P(n-2)-P(n-5)-P(n-7)+P(n-12)+P(n-15) +\ldots
(знаки у пар членов чередуются, вычитаемые в одной паре равны (3q^2-q)/2 и (3q^2+q)/2 ; сумма конечна - мы считаем, что P(k)=0 при k<0 ).

Однако и без ее использования можно придумать способ вычисления P(n), который существенно эффективнее перебора и подсчета всех разбиений.

Обозначим через R(n,k) (для n\ge 0, k\ge0 ) число разбиений n на целые положительные слагаемые, не превосходящие k. (При этом R(0,k) считаем равным 1 для всех k\ge 0.) Очевидно, P(n)=R(n,n). Все разбиения n на слагаемые, не превосходящие k, разобьем на группы в зависимости от максимального слагаемого (обозначим его i ). Число R(n,k) равно сумме (по всем i от 1 до k ) количеств разбиений со слагаемыми не больше k и максимальным слагаемым, равным i. А разбиения n на слагаемые не более k с первым слагаемым, равным i, по существу представляют собой разбиения n-i на слагаемые, не превосходящие i (при i\le k ). Так что

\begin{alignat*}{2}
    R(n,k)&=\sum\limits_{i=1}^{k} R (n-i,i)\qquad &&\text{при $k\le n$},\\
    R(n,k)&=R (n,n)\qquad                         &&\text{при $k \ge n$},
\end{alignat*}
что позволяет заполнять таблицу значений функции R.

2.7.2. (Счастливые билеты; предлагалась на Всесоюзной олимпиаде по программированию 1989 года.) Последовательность из 2n цифр (каждая цифра от 0 до 9 ) называется счастливым билетом, если сумма первых n цифр равна сумме последних n цифр. Найти число счастливых последовательностей данной длины.

Решение. (Сообщено одним из участников олимпиады; к сожалению, не могу указать фамилию, так как работы проверялись зашифрованными.) Рассмотрим более общую задачу: найти число последовательностей, где разница между суммой первых n цифр и суммой последних n цифр равна k ( k =
-9n,\ldots, 9n ). Пусть T(n,k) - число таких последовательностей.

Разобьем множество таких последовательностей на классы в зависимости от разницы между первой и последней цифрами. Если эта разница равна t, то разница между суммами групп из оставшихся n-1 цифр равна k-t. Учитывая, что пар цифр с разностью t бывает 10 - |t|, получаем формулу

T(n,k) = \sum\limits_{t=-9}^{9}  (10-|t|) T(n-1,k-t).
(Некоторые слагаемые могут отсутствовать, так как k-t может быть слишком велико.)

В некоторых случаях ответ удается получить в виде явной формулы.

2.7.3. Доказать, что число Каталана (количество последовательностей длины 2n из n единиц и n минус единиц, в любом начальном отрезке которых не меньше единиц, чем минус единиц) равно C_{2n}^n/(n+1).

Указание. Число Каталана есть число ломаных, идущих из (0,0) в (2n,0) шагами (1,1) и (1,-1), не опускающихся в нижнюю полуплоскость, т.е. разность числа всех ломаных (которое есть C_{2n}^{n} ) и числа ломаных, опускающихся в нижнюю полуплоскость. Последние можно описать также как ломаные, пересекающие прямую y=-1. Отразив их кусок справа от самой правой точки пересечения относительно указанной прямой, мы установим взаимно однозначное соответствие между ними и ломаными из (0,0) в (2n,-2). Остается проверить, что C_{2n}^{n}-C_{2n}^{n+1}=C_{2n}^{n}/(n+1).

< Лекция 1 || Лекция 2: 12345 || Лекция 3 >
Татьяна Новикова
Татьяна Новикова
Россия, Пошатово
Artem Bardakov
Artem Bardakov
Россия