algo

Олимпиадные алгоритмы

Задача: Мячик на лестнице

Условие:

На вершине лесенки, содержащей $N$ ступенек, находится мячик, который начинает прыгать по ним вниз, к основанию. Мячик может прыгнуть на следующую ступеньку, на ступеньку через одну или через $2$. (То есть если мячик лежит на $8$-ой ступеньке, он может переместиться на $5$-ую, $6$-ую или $7$-ую.) Определить число всевозможных “маршрутов” мячика с вершины на землю.

Разбор решения:

Для начала нужно решить, как записать формулой варианты маршрута, если мячик стоит на неизвестной ступеньке $N$.

Есть три варианта: мячик прыгает на ступеньку $N - 1$, где у него будет некое число вариантов дальнейшего маршрута, может прыгнуть на ступеньку $N - 2$, где также будет свое количество вариантов, или на ступеньку $N - 3$, где у мячика тоже будут различные варианты дальнейшего пути. То есть можно утверждать, что количество вариантов для ступеньки $N$ – ничто иное как сумма чисел вариантов маршрута предыдущих ему ступенек, это можно записать формулой:

\[M_N = M_{N - 1} + M_{N - 2} + M_{N - 3}\]

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

Как и в прошлой задаче, составим таблицу:

$N$ 1 2 3 4 5 i
решение 1 2 4 7 13 $M_i = M_{i - 1} + M_{i - 2} + M_{i - 3}$

Общая логика решения идентична решению задачи о последовательности Фибоначчи:

    vector<int> M(N+1);
    M[0] = 0; M[1] = 1; M[2] = 2; M[3] = 4;

    for (int i=2; i<=N; ++i) {
        M[i] = M[i-1] + M[i-2] + M[N-3];
    }
    cout << M[N] << '\n';

Теперь изначально мы добавили в таблицу три решения, потому что мы можем прыгать на три ступеньки вниз. Это обязывает нас рассмотреть решение для первых трех ступенек.

Если мячик стоит на первой ступеньке, то у него есть только один вариант – спрыгнуть вниз. Если мячик стоит на второй ступеньке, он может спрыгнуть на первую ступеньку, с которой можно спрыгнуть только одним способом, или сразу перепрыгнуть через ступеньку и спрыгнуть с лестницы – $2$ варианта. Если же мячик стоит на третьей ступеньке, он может спрыгнуть либо на вторую, откуда можно спрыгнуть двумя вариантами, либо сразу на первую, либо перепрыгнуть через две и спрыгнуть с лестницы – $4$ варианта.

Асимптотика данного решения есть $O(N)$.