11-1. 동적 계획법 알아보기

동적 계획법(dynamic programming)

동적 계획법의 핵심 이론

원리 & 구현 방식

  1. 큰 문제를 작은 문제로 나눌 수 있어야 한다.
  2. 작은 문제들이 반복돼 나타나고 사용되며 이 작은 문제들의 결괏값은 항상 같아야 한다.
  3. 모든 작은 문제들은 한 번만 계산해 DP 테이블에 저장하며 추후 재사용할 때는 이 DP 테이블을 이용한다. ⇒ 메모이제이션(memoization) 기법
  4. 동적 계획법은 top-down 방식과 bottom-up 방식으로 구현 가능

예시 - 피보나치 수열

D[N] = D[N-1] + D[N-2] # N번째 수열 = (N-1)번째 수열 + (N-2)번째 수열
  1. 동적 계획법으로 풀 수 있는지 확인

  2. 점화식 세우기

  3. memoization 원리 이해하기

  4. top-down 구현 방식 이해하기

    ex)

    import sys
    input = sys.stdin.readline
    
    ## 입력
    N = int(input())
    D = [-1] * (N+1)
    D[0] = 0
    D[1] = 1
    
    ## 처리
    def fibo(n):
        if D[n] != -1: # 기존에 계산한 적이 있는 부분의 문제는 재계산하지 않고 리턴
            return D[n]
        # memoization: 구한 값을 바로 리턴하지 않고 DP 테이블에서 저장한 후 리턴하도록 로직 구현
        D[n] = fibo(n-2) + fibo(n-1)
        return D[n]
    fibo(N)
    
    ## 출력
    print(D[N])
    
  5. bottom-up 구현 방식 이해하기

    ex)

    import sys
    input = sys.stdin.readline
    
    ## 입력
    N = int(input())
    D = [-1] * (N+1)
    D[0] = 0
    D[1] = 1
    
    ## 처리
    for i in range(2, N+1):
        D[i] = D[i-2] + D[i-1] # 반복문을 이용하여 아래서부터 값을 채워가는 방식
    
    ## 출력
    print(D[N])