👉 항상 새로운 부분문제를 생성해내기 보단 계속해서 같은 부분 문제가 여러 번 재사용되거나 재귀 알고리즘을 통해 해결
👉 fibo 3~5 들이 이미 진행했던 연산임에도 불구하고 반복적으로 연산
fibo[i] = fibo[i-1] + fibo[i-2] 👉 작은 부분 문제에서 구한 최적의 답으로 합쳐진 큰 문제의 최적의 답을 구할 수 있어야 한다는 것private static long Fibonacci(int n) {
// 기저 조건을 기반으로 테이블을 채워나간다(Tabulation).
for(int i = 3; i <= n; i++) {
// 점화식을 이용하여 쉽게 구할 수 있다.
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
private static long Fibonacci(int n) {
// 기저 조건(피보나치 수열의 초항).
if (n == 1 || n == 2) {
return dp[n] = 1;
}
// 만일, 저장된 값이 존재하는 경우 기억된 값을 바로 넘겨준다.
if (dp[n] != 0) {
return dp[n];
}
// 그렇지 않은 경우, 기저 조건까지 내려가서 구해진 값을 저장하면서 재귀를 전이한다.
else {
return dp[n] = Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
https://velog.io/@dnu05043/%EB%B0%B1%EC%A4%80-Fibonacci-2747%EB%B2%88-%EB%AC%B8%EC%A0%9C
https://www.acmicpc.net/problem/11726
https://sskl660.tistory.com/87
https://www.inflearn.com/course/%EB%91%90%EC%9E%87-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%B0%94/dashboard