하나도 다이나믹하지 않다. 그냥 멋있어 보인다고 붙인 이름이다.
1. 문제를 쪼개서 작은 문제의 답을 구하고, 그걸로 더 큰 문제의 답을 하는 것을 반복
2. 분할정복과 비슷한 느낌
f(0) = 0
f(1) = 1
f(i + 2) = f(i + 1) + f(i)
※ 메모이제이션 적용 X
N = int(input())
def fibonacci(num):
if num == 0:
return 0
elif num == 1:
return 1
else:
return fibonacci(num - 1) + fibonacci(num - 2)
print(fibonacci(N))
※ 메모이제이션 적용 O : 재귀
N = int(input())
cache = [-1] * 91
cache[0] = 0
cache[1] = 1
def fibonacci(num):
if cache[num] == -1:
cache[num] = fibonacci(num - 1) + fibonacci(num - 2)
return cache[num]
print(fibonacci(N))
※ Tabulation 적용 O : 반복문
N = int(input())
cache = [-1] * 91
cache[0] = 0
cache[1] = 1
for i in range(2, N + 1):
cache[num] = cache(num - 1) + cache(num - 2)
print(cache(N))
※ 메모이제이션 적용 X
import sys
sys.setrecursionlimit(10 ** 7)
N, K = map(int, input().split())
def bino(n, k):
if k == 0 or k == n:
return 1
return bino(n - 1, k - 1) + bino(n - 1, k)
print(bino(N, K))
※ 메모이제이션 적용 O : 재귀
import sys
sys.setrecursionlimit(10 ** 7)
cache = [[0] * 1001 for _ in range(1001)]
N, K = map(int, input().split())
def bino(n, k):
if cache[n][k]:
return cache[n][k]
if k == 0 or k == n:
cache[n][k] = 1
else:
cache[n][k] = bino(n - 1, k - 1) + bino(n - 1, k)
return cache[n][k]
print(bino(N, K))
※ Tabulation 적용 O : 반복문
cache = [[0] * 1001 for _ in range(1001)]
N, K = map(int, input().split())
for i in range(1001):
cache[i][0] = cache[i][i] = 1
for j in range(1, i):
cache[i][j] = cache[i - 1][j - 1] + cache[i - 1][j]
print(cache[N][K])