Задание 12 КЕГЭ: исполнитель с командами +N и ×N — как найти программу?
У исполнителя две команды, например «прибавь 1» и «умножь на 2». Дано стартовое число и нужно получить целевое; спрашивают сколько программ, или самую короткую. Перебирать руками дерево вариантов нереально. Как подступиться на Python?
4 ответа
Это классическая задача на динамику «снизу вверх»: число способов получить n = сумма способов получить все его прообразы.
start, end = 3, 20
d = [0] * (end + 1)
d[start] = 1
for n in range(start + 1, end + 1):
ways = 0
if n - 1 >= start: # последней была команда +1
ways += d[n - 1]
if n % 2 == 0: # последней была команда *2
ways += d[n // 2]
d[n] = ways
print(d[end])
Идея: чтобы попасть в n, последний шаг был либо +1 (из n−1), либо ×2 (из n/2, если n чётное). Складываем способы добраться до этих предшественников. Если в условии есть «обязательно пройти через число K» — считаешь d[start→K] и d[K→end] и перемножаешь.
Динамика: d[n] = d[n-1] + d[n//2] (второе слагаемое если n чётное), стартовая ячейка = 1.
Можно и рекурсией с мемоизацией от конца к началу, но итеративная таблица меньше шансов словить RecursionError на больших числах.
ДП снизу вверх.