← Все вопросы

Задание 23 ЕГЭ: как посчитать количество программ-путей у исполнителя?

Задан 19 месяцев назад628 просмотров3 ответа
13

Исполнитель умеет прибавлять 1 и умножать на 2 (или похожие команды), надо найти, сколько разных программ переводят число из A в B, иногда с обязательным прохождением через точку C. Чувствую, что это рекурсия или динамика, но не соберу.

3 ответа

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

Классическая динамика/рекурсия с мемоизацией: число способов попасть в 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 этой точки сделать 0, да · 19 месяцев назад
Павел Дмитриев перемножить два участка — гениально просто 🙏 · 19 месяцев назад
6

ways(B) = сумма ways по всем позициям, откуда команда ведёт в B. Через лямбды до A → перемножаешь.

4

Динамика снизу вверх массивом тоже отлично заходит, кому рекурсия не близка.

Ваш ответ

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