동적 프로그래밍(Dynamic Programming)이 란?
작은 결과 값을 이용해 더 큰 결과값으로 올라가 구하려는 결과값을 얻어 내는 알고리즘
> 중복되는 것은 기억해 두어서 skip (메모이제이션)
대표적인 것으로 피보나치 수열이 있다.
f(x) = f(x-1) + f(x-2);
1,1,2,3,5,7,14,21 ... 34,55
단순한 피보나치 수열을 짠 코드는
int fibo1(int n) {
if (n < 2) {
return 1;
}
return fibo(n - 1) + fibo(n - 2);
}
이렇게 된다.
하지만 이 과정에서 똑같은 작업이 중복되어 일어난다.
예를들어 5를 구할때
5 - 4 -3 -2
-1
- 2
- 3 - 2
-1
3부터는 중복이 일어난다
이러한 중복을 막기위해 쓰는 것이 메모이제이션이다.
한번 구했던 값이면 다시 구하지 않고 넘어가도록 !
구했던 값인지 체크하는 로직을 넣어주기만 하면된다.
메모이제이션이 적용된 피보나치 수열 코드이다.
int fibo(int n) {
if (dp[n] > 0) {
return dp[n];
}
if (n < 2) {
return dp[n] = n;
}
return dp[n] = fibo(n - 1) + fibo(n - 2);
}
가장 이해 하기 쉬운 예로 접하니 더 이해하기 좋다.
구한 값을 dp[n]에 넣어주니 dp[n]의 값이 0 보다 큰지만 체크해주면 된다! ( 그전에 구한 값인가~?)
이렇게 하면 쉽지만...
다른 문제들을 풀어보면 어렵더라
다른 문제를 풀어 보고 더 적용해 봐야겠다.
그럼 이만
뿅!
'DEVELOP > ALGORITHM' 카테고리의 다른 글
KOITP 정렬된 배열 (투포인터 알고리즘) 문제 (0) | 2018.06.04 |
---|---|
KOITP 아나그램 문제 풀기 (0) | 2018.06.04 |
백준 2805 나무자르기 (이분탐색) 풀이 (0) | 2018.02.05 |
백준 1920 수찾기 (이진탐색) (0) | 2018.02.04 |
백준 2003번 수들의 합 2 풀이 (0) | 2018.01.22 |