ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Dynamic Programming
    알고리즘/백준 2020. 8. 9. 15:31

    동적 계획법

    - 큰 문제를 작은 문제로 나누어 푸는 알고리즘이다.

    작은 문제들을 해결한 뒤, 해당 답을 저장해놓고 그보다 큰 문제를 풀이하는데 앞서 저장해둔 값들을 활용해 풀어나간다.

     

    DP(Dynamic Programming)을 사용 조건

    1. 작은 문제로 쪼갤 수 있다.

    2. 작은 문제에서 구한 값은 큰 문제를 풀이할 때도 동일한 값이여야 한다.

    이때, 메모이제이션(Memoization)이 활용된다.

     

    +Memoization : 계산한 값을 메모리에 저장해두고, 여러번 같은 값 계산을 피하는 최적화 기법(실행속도를 높이고, 메모리를 절약할 수 있다.)

     


    EX) Fibonacci수열

    피보나치 수열은 1, 1, 2, 3, 5, 8, 13, 21 ... 의 수열이다.

    즉, fibo(3) = fibo(2) + fibo(1)

    fibo(n) = fibo(n-1) + fibo(n-2) 이다.

     

    또한, fibo(n)을 구하기 위해 fibo(1)부터 fibo(n-1) 까지의 작은 문제들이 반복되며, 항상 작은 문제들의 값은 같다.

    #include <stdio.h>
    //배열사용시, index주의
    int arr[100];
    
    int fibo(int n){
        if(n<2)
        	return arr[n];
    //메모이제이션
        if(arr[n]!=0)
        	return arr[n];
        arr[n] = fibo(n-1) + fibo(n-2);
        return arr[n];
    }
    
    int main(){
    //초기 값 명시
        arr[1] = 1;
        arr[2] = 1;
        printf("%d\n", fibo(10));
    }

    여기서의 점화식은 arr[] = fibo(n-1) + fibo(n-2);

    DP의 경우에는 보통 규칙성을 찾아 점화식을 세워 해결한다.

     


    Bottom-up과 Top-down

    Bottom-up은 작은 문제부터 하나씩 구해가며, 큰 문제를 해결하는 방법이다.(반복문을 이용한 fibo등)

    Top-down은 보통 재귀함수로 구현되는 경우이며, 큰 문제해결시 작은 문제가 풀리지않았다면, 작은 그때 작은 문제를 해결한다.

     

    분할정복과의 차이점 : DP의 경우 작은 문제의 답이 항상 같아야한다.

     

     

     

     

    '알고리즘 > 백준' 카테고리의 다른 글

    백준 1110_더하기 사이클  (0) 2020.10.09
    백준 2193_이친수  (0) 2020.08.17
    백준 1463_1로 만들기  (0) 2020.08.17
    백준1260_DFS와 BFS  (0) 2020.06.03
    백준 알고리즘2798_블랙잭  (0) 2020.05.28
Designed by Tistory.