여름의 서재
[알고리즘 종류] 동적 계획법(Dynamic Programming) 본문
728x90
- 동적 계획법
- 일반적으로 주어진 문제를 풀기 위해서, 문제를 여러 개의 하위 문제(subproblem)로 나누어 푼 다음, 그것을 결합하여 최종적인 목적에 도달하는 것
- 각 하위 문제의 해결을 계산한 뒤, 그 해결책을 저장하여 후에 같은 하위 문제가 나왔을 경우 그것을 간단하게 해결할 수 있음. ( Memoization: 메모이제이션 )
- 완전 검색을 좀 더 효율적으로 하는 방법
- 분할 정복은 하향식인 반면 동적 계획법은 상향식으로 접근해야 함
🔍 동적 계획법 적용 문제 조건
1. 중복 부분문제 구조
: 동적 계획법은 큰 문제를 이루는 작은 문제들을 먼저 해결하고 작은 문제들의 최적 해(Optimal Solution)를 이용하여 순환적으로 큰 문제 해결
2. 최적 부분문제 구조
: 주어진 문제가 최적화의 원칙(Principle of Optimality)을 만족해야만 동적 계획법을 효율적으로 적용 가능
💡 최적화의 원칙
- 어떤 문제에 대한 해가 최적일 때 그 해를 구성하는 작은 문제들의 해 역시 최적이어야 함
📄 활용 예제
- 피보나치수열
# dp 이용
def fibo_memo(n):
f = [0, 1]
for i in range(2, n+1):
f.append(f[i-1] + f[i-2])
return f[n]
print(fibo_memo(50))
# 분할 정복 이용 (n이 50만 되도 컴터 터짐..!)
def fibo(n):
if n < 2:
return n
return fibo(n-1) + fibo(n-2)
print(fibo(7))
'알고리즘 > 알고리즘 종류' 카테고리의 다른 글
[알고리즘 종류] 백 트랙킹 (Backtracking) (0) | 2021.08.23 |
---|---|
[알고리즘 종류] 투 포인터(Two Pointer) (0) | 2021.08.16 |
[알고리즘 종류] DFS(깊이우선탐색) & BFS(너비우선탐색) (0) | 2021.08.13 |
[알고리즘 종류] 보이어-무어 알고리즘 (0) | 2021.08.13 |
[알고리즘 종류] KMP 알고리즘 (0) | 2021.08.13 |
Comments