
복잡한 문제를 간단한 부분 문제로 분할하여 부분해를 찾은 후, '기록'하는 과정을 반복하여 모든 부분해들을 찾고, 원래 문제의 해결책을 찾는 전략이다.
한번 해결된 부분 문제의 정답을 메모리에 기록하여, 한번 계산한 답은 다시 계산하지 않도록 하는 문제해결 기법
'programming'의 의미는 과정이 테이블에 기록되는 것을 뜻하며, 'dynamic'의 의미는, 테이블이 갱신되는 것을 뜻한다.
동적 프로그래밍은 주어진 문제를 분할한 후 더 작은 부분 문제의 해를 찾은 후, 이를 통합하여 더 큰 문제의 해를 찾는 상향식 문제해결 전략이다.

def fibo(n):
if n == 0 or n == 1:
return n
return fibo(n-1) + fibo(n-2)
print(fibo(5))
def fibo_dp(n) :
cache = [0 for _ in range(n+1)]
cache[0] = 0
cache[1] = 1
for i in range(2, n+1):
cache[i] = cache[i-1]+cache[i-2]
return cache[n]