Dynamic Programming
한줄 요약: 작은 부분문제들이 반복되는 것을 이용해 문제를 푼다. 정답을 구하고 그 답을 메모해두고 그 다음 문제를 풀고 앞의 답을 이용한다. 수열에서 점화식을 구하는거랑 비슷한 느낌이다.
사용 조건
- 작은 문제의 반복
- 같은 문제는 구할 때 마다 같은 값
Memoization
작은 문제 계산 값을 저장해놓고 다시 사용하는 것
def fib(n):
if n < 0:
raise IndexError(
'Index was negative.'
'No such thing as a negative index in a series.'
)
elif n in [0,1]:
return n
print("computing fib(%i)" % n)
return fib(n-1) + fib(n-2)
n번째 피보나치 수를 계산하는 재귀식. 같은 입력값에 대해 여러번 실행함
덧셈 연산이 2**(n-2)-1번 이루어지고 시간복잡도는 O(2^n)
def me(n):
memo[0] = 1
memo[1] = 1
if n<2:
return memo[n]
for i in range(2,n+1):
memo[i] = memo[i-2] + memo[i-1]
return memo[n]
if __name__ = '__main__':
n = int(input())
me = [0 for i in range(n+2)]
print(me(n))
print(me)