← Все вопросы

Задание 12 КЕГЭ: исполнитель с командами +N и ×N — как найти программу?

Задан 4 дня назад504 просмотров4 ответа
15

У исполнителя две команды, например «прибавь 1» и «умножь на 2». Дано стартовое число и нужно получить целевое; спрашивают сколько программ, или самую короткую. Перебирать руками дерево вариантов нереально. Как подступиться на Python?

4 ответа

28
✓ Принятый ответ — помог автору

Это классическая задача на динамику «снизу вверх»: число способов получить 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] и перемножаешь.

Сергей Галанов Через K — перемножить два куска, ловушка многих · 2 дня назад
Елена Костюченко Это по сути то же ДП, что в задании 23, только команды другие · 2 дня назад
9

Динамика: d[n] = d[n-1] + d[n//2] (второе слагаемое если n чётное), стартовая ячейка = 1.

5

Можно и рекурсией с мемоизацией от конца к началу, но итеративная таблица меньше шансов словить RecursionError на больших числах.

3

ДП снизу вверх.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект