Я решаю очень простой алгоритм, который запрашивает рекурсию и запоминание. Код ниже работает нормально, но не соответствует ограничениям по времени. Кто-то посоветовал мне оптимизировать хвостовую рекурсию, но это не хвостовая рекурсия.
Вопрос
• Улитка может подниматься на 2 метра в 1 день, если идет дождь, в противном случае на 1 метр
• Вероятность дождя в день составляет 75%.
• Учитывая количество дней (<= 1000) и рост (<= 1000), вычислите вероятность того, что улитка может выбраться из колодца (забраться больше, чем высота колодца) </p>
Этот код Python реализован с рекурсией и запоминанием.
import sys
sys.setrecursionlimit(10000)
# Probability of success that snails can climb 'targetHeight' within 'days'
def successRate(days, targetHeight):
global cache
# edge case
if targetHeight <= 1:
return 1
if days == 1:
if targetHeight > 2:
return 0
elif targetHeight == 2:
return 0.75
elif targetHeight == 1:
return 0.25
answer = cache[days][targetHeight]
# if the answer is not previously calculated
if answer == -1:
answer = 0.75 * (successRate(days - 1, targetHeight - 2)) + 0.25 * (successRate(days - 1, targetHeight - 1))
cache[days][targetHeight] = answer
return answer
height, duration = map(int, input().split())
cache = [[-1 for j in range(height + 1)] for i in range(duration + 1)] # cache initialized as -1
print(round(successRate(duration, height),7))