반응형
다이나믹 프로그래밍(동적계획법)이란?
- 큰 문제를 풀기 위해서 작은 문제를 풀어 나가는 방식이며,
작은 문제에서 반복이 없다는 것이 특징입니다. -> 분할 정복 기법과 다른 결정적인 차이
또한 하나의 문제를 단 한 번만 푸는 알고리즘
다이나믹 프로그래밍 조건
1. 큰 문제를 작은 문제로 나눌 수 있다.
2. 작은문제에서 구한 정답은 이것을 포함한 큰 문제에서도 동일한 정답이다.
이러한 조건때문에 시간 복잡도를 훨씬 줄일 수 있습니다!!!
어떻게 구현할까요??
메모이제이션(Memoization) 기법 활용
말 그대로 메모하는 기법입니다.
작은 문제 계산된 결과값을 배열을 사용해서 저장하고,
나중에 큰 문제에서 동일한 계산을 요구할 때 배열의 저장된 값을 불러오는 것입니다.
-> dp 리스트 초기화해서 안에 담고 나중에 불러오기
유형
Top-down
하향식이며 재귀문으로 표현
# 계산된 결과를 메모이제이션하기 위한 리스트 초기화
d=[0]*100
# 피보나치 함수를 재귀함수로 구현(탑다운 다이나믹 프로그래밍)
def fibo(x):
# 종료 조건 (1 or 2)
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유형입니다.
# 앞서 계산된 결과를 저장하귀 위한 dp테이블 초기화
d=[0]*100
# 첫 번째,두 번째 피보나치 수는 1
d[1]=1
d[2]=1
n=99
# 피보나치 함수 반복문으로 구현(보텀업)
for i in range(3,n+1):
d[i]=d[i-1]+d[i2]
print(d[n])
끝으로 나동빈 선생님께서
dp유형은 어렵게 나오면 엄청난 난이도를 요하기 때문에
기본 유형만 알아도 된다는
위로??를 해주셨습니다.
영상 보고 참고했습니당
www.youtube.com/channel/UChflhu32f5EUHlY7_SetNWw
반응형
'알고리즘 > 알고리즘 개념' 카테고리의 다른 글
[알고리즘 개념] 순열 조합 부분집합(순조부~) (0) | 2021.08.20 |
---|