: 어떤 문제를 여러개의 작은 문제로 나눠 해결하고 그 결과를 저장했다가 큰 문제를 풀때 사용하는 문제 풀이 기법.
: 문제의 최종 해결 방법은 부분 문제의 최적 문제 해결 방법으로 구성된다. 문제 해결의 모든 단계에서 해당 단계의 최적해가 도출 되어야 한다.
: 동일한 작은 문제들이 중복되어 사용되는 경우 사용 가능하다. Memorization을 통해 문제 재사용한다.
: n의 결과값을 찾기 위해 위에서부터 출발하여 작은 문제까지 내려간 다음에 결과값을 재사용하여 올라가는 방식.
def fibo(n):
if n == 1 or n == 2:
return 1
else:
if memorization[n] != 0:
return memorization[n]
else:
memorization[n] = fibo(n-1)+ fibo(n-2)
return memorization[n]
if __name__ == "__main__":
num = 5
memorization = [0] * (num+1)
print(fibo(num))
: 가장 작은 문제들로부터 답을 구하여 큰 문제를 해결하는 방식.
재귀 호출을 하지 않기 때문에 시간과 메모리 사용량을 줄일 수 있다.
if __name__ == "__main__":
num = 5
dp = [0] * (num +1)
dp[1] =1
dp[2] =1
for i in range(3, num+1):
dp[i] = dp[i-1]+dp[i-2]
print(dp[num])