Dynamic Programming ... 뭔가 이름만 들어도 무섭게 생겼다
-> 기억하기 알고리즘
-> 메모를 사용한다
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
경우의수
1줄 : 1개
2줄 : 2개
3줄 : 4개
4줄 : 8개
2^(n-1)
1000줄이면? 어머어마한 경우의 수
수행시간 단축 기법이기 때문에 구현 방법이 다양합니다.
| idx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| fib | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 |
fib(n) = fib(n-1) + fib(n-2)
fib(0) = 0
fib(1) = 1
function fib(num){
// 2. 탈출 조건
if (num < 2) return num;
// 1. 기본 동작
return fib(num-1) + fib(num-2)
}
만약 num의 크기가 크다면? -> 중복되는 연산이 다수 발생!

이미 계산되었던 중복 작업이 많이 호출됩니다.
DP적으로 생각해보자...function fib(num) {
// -1 : 한 번도 연산한 적이 없다
if (dp[num] === -1) dp[num] = fib(num - 1) + fib(num - 2);
return dp[num];
}
let dp = Array(100).fill(-1);
//계산이 필요없는 정의된 값
dp[0] = 0;
dp[1] = 1;
console.log(fib(10));
더 간단하게 할 수 있다...!
let num = 10;
let dp = Array(100).fill(0);
dp[1] = 1;
for (let i = 2; i < num + 1; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
console.log(dp[num]);
재귀처럼 뒤에서 계산하는게 아니라 앞에서부터 계산해나갑니다. 위처럼 해도 되지만 피보나치는 워낙 간단하기 때문에 반복문으로도 충분히 계산이 가능합니다.
간단한 연습용 - DP적으로 생각해보자
https://velog.io/@sonata7531/%EB%B0%B1%EC%A4%80-2839-%EC%84%A4%ED%83%95-%EB%B0%B0%EB%8B%AC-nodejs
중복X !
누적 !
저장 !
https://www.acmicpc.net/problem/9095
https://www.acmicpc.net/problem/2579
https://www.acmicpc.net/problem/2193
https://www.acmicpc.net/problem/17425 어려움