Задание №23: Динамическое программирование (Количество программ)
Основные типы и прототипы задания №23:
Количество программ преобразования чисел
Обязательные и избегаемые этапы траектории
Условие задания
(М. Ишимов) Исполнитель преобразует число на экране. У исполнителя есть три команды, которые обозначены латинскими буквами:
A. Вычти 2Выполняя первую из них, исполнитель уменьшает значение на экране на 2, выполняя вторую – уменьшает на минимальную ненулевую цифру числа, выполняя третью – уменьшает на остаток от деления числа на 4. Программа для исполнителя – это последовательность команд, каждая из которых уменьшает число. Сколько существует программ, для которых при исходном числе 96 результатом является число 60, и при этом траектория вычислений содержит число 64? Траектория вычислений программы – это последовательность результатов выполнения всех команд программы. Например, для программы ABC при исходном числе 38 траектория будет состоять из чисел 36, 33, 32.
B. Вычти минимальную ненулевую цифру числа
C. Вычти остаток от деления на 4
Ответ:
37104
Шаблон решения на Python
# === Задание 23: Динамическое программирование (Количество программ) ===
def f(cur, target, avoid=None):
if cur > target or (avoid and cur == avoid): return 0
if cur == target: return 1
return f(cur + 1, target, avoid) + f(cur * 2, target, avoid)
# Траектория из A в B (через обязательную точку):
print("Количество программ:", f(2, 12) * f(12, 30))