Задача на динамическое программирование
442 просмотра
			
	
                                            											
Исполнитель Калькулятор преобразует число, записанное на экране. У исполнителя есть три команды, которым присвоены номера:
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, '', '_'))						 
             
         
						