Algorithm

[Dynamic Programming] DP 동적계획

tongnamuu 2021. 8. 13. 01:22

동적 계획법 : 큰 문제를 작은 문제로 나눠서 푸는 알고리즘

두 가지 속성을 만족해야 DP로 문제를 해결할 수 있다.

1. Overlapping Subproblem

  • 큰 문제와 작은 문제를 같은 방법으로 풀 수 있다.
  • 문제를 작은 문제로 쪼갤 수 있다.

2. Optimal Substructure

  • 문제의 정답을 작은 문제의 정답에서 구할 수 있다.

피보나치 수를 기준으로 보면

 

 

 

메모이제이션 : 실행된 결과를 저장해두었다가 재사용하는 최적화 기법

 

Top - Down :

  • 큰 문제를 작은 문제로 나눈다. 
    fib(n) = fib(n-1) + fib(n-2)
  • 작은 문제를 푼다.
    fib(n-1) 과 fib(n-2)를 호출해 문제를 푼다.
  • 작은 문제를 풀었으니 큰 문제를 해결한다.
    fib(n-1) 과 fib(n-2) 결과를 바탕으로 fib(n)을 해결한다.

 

 

 

Tabulation : 테이블을 채워나가는 방식

 

Bottom -Up:

  • 문제를 크기가 작은 문제부터 차례대로 푼다.
    fib(0) = 0, fib(1)  = 1
  • 문제의 크기를 조금씩 키우면서 문제를 해결한다.
    fib(2) = fib(1) + fib(0)
    fib(3) = fib(2) + fib(1)
    ...
  • 작은 문제를 모두 해결했기 때문에 큰 문제는 항상 풀 수 있다.
    fib(n)
  • 필요하지 않은 하위문제도 해결할 때가 있다.
  • 문제를 잘 분석해서 최적의 순서를 찾아야함
  • CPU캐시에 친화적
  • 재귀함수호출을 피할 수 있다.