💡문제접근
- 다이나믹 프로그래밍을 이용하는 문제로 이중 for문으로 구현할 수 있었다.
💡코드(메모리 : 31120KB, 시간 : 784ms)
import sys
input = sys.stdin.readline
N = int(input())
lst = list(map(int, input().strip().split()))
dp = [1] * (N+1)
for i in range(1, N):
for j in range(i):
if lst[i] < lst[j]:
dp[i] = max(dp[i], dp[j] + 1)
print(N - max(dp))
💡소요시간 : 19m
📌 Top-Down 방식이란?
"재귀함수"
로 다이나믹 프로그래밍 소스 코드를 작성하는 방식
- Top-Down 방식에는 "메모이제이션"이 활용된다.
- 메모이제이션이란 한 번 구한 결과를 메모리 공간에 메모해두고 같은 식을 다시 호출하면 메모한 결과를 그대로 가져오는 기법을 의미한다.
d = [0] * 100
def fibo(x):
if x == 1 or x == 2:
return 1
if d[x] != 0:
return d[x]
d[x] = fibo(x - 1) + fibo(x - 2)
return d[x]
print(fibo(99))
📌 Bottom-Up 방식이란?
- 단순히
"반복문"
으로 다이나믹 프로그래밍 소스 코드를 작성하는 방식
- 작은 문제부터 차근차근 답을 도출
- Dp 테이블이 활용된다.
d = [0] * 100
d[1] = 1
d[2] = 1
n = 99
for i in range(3, n + 1):
d[i] = d[i - 1] + d[i - 2]
print(d[n])