Задание 23 ЕГЭ: как посчитать количество программ-путей у исполнителя?
Исполнитель умеет прибавлять 1 и умножать на 2 (или похожие команды), надо найти, сколько разных программ переводят число из A в B, иногда с обязательным прохождением через точку C. Чувствую, что это рекурсия или динамика, но не соберу.
3 ответа
Классическая динамика/рекурсия с мемоизацией: число способов попасть в B = сумма способов попасть в каждую позицию, ИЗ которой одной командой можно прыгнуть в B. Удобнее считать «сколько программ ведёт из A в данное число».
from functools import lru_cache
@lru_cache(None)
def ways(x):
if x == 1: # стартовая точка A
return 1
if x < 1:
return 0
total = 0
if (x - 1) >= 1: # обратная к +1
total += ways(x - 1)
if x % 2 == 0: # обратная к *2
total += ways(x // 2)
return total
print(ways(20))
Если надо «обязательно через C», считаешь ways(A→C) и ways(C→B) и перемножаешь. Запретную точку просто возвращаешь как 0 способов.
ways(B) = сумма ways по всем позициям, откуда команда ведёт в B. Через лямбды до A → перемножаешь.
Динамика снизу вверх массивом тоже отлично заходит, кому рекурсия не близка.