Задача на динамическое программирование
300 просмотров
Исполнитель Калькулятор преобразует число, записанное на экране. У исполнителя есть три команды, которым присвоены номера:
1. Прибавь 1
2. Прибавь 3
3. Умножь на 2
Первая команда увеличивает число на экране на 1, вторая увеличивает его на 3, третья – умножает на 2. Программа для исполнителя – это последовательность команд. Сколько существует программ, которые преобразуют исходное число 2 в число 51, и при этом траектория вычислений содержит число 18 и не содержит число 33. Также программа не должна содержать двух команд «Умножь на 2» подряд.
Мой код и ответ неправильный.
from functools import lru_cache
@lru_cache(None)
def fn(s, f, c, k):
if s == 33:
return 0
if '33' in c:
return 0
if '33' in k:
return 0
if s == f:
if not '33' in c:
if '18' in k:
if not '33' in k:
return 1
else:
return 0
else:
return 0
else:
return 0
elif s > f:
return 0
else:
return fn(s+1, f, c+'1', k + '_' + str(s)) + fn(s+3, f, c+'2', k + '_' + str(s)) + fn(s*2, f, c+'3', k + '_' + str(s))
print(fn(2, 51, '', '_'))