피보나치 수열을 Recursive로 구현해보면, 중복되는 계산을 너무 많이 하게된다. 하나의 함수는 두개의 함수를 호출하므로 대충 O() 정도의 시간복잡도를 지닌다.
이러한 재귀적인 중복계산으로 시간을 낭비하는 일을 줄이기 위해 DP를 사용하여 코드를 짤 수 있다. 아래는 DP를 이용한 코드다. 벡터를 이용해 각 함수의 결과값을 저장해놓고 필요할 때, 또 다시 계산하지 않고 바로 참조하여 값을 불러온다. 이것을 메모이제이션이라고 한다.
fibonacci_dp(5)라면, dp[2]부터 값이 채워지기 시작한다. dp[3]은 dp[2]값과 1이 리턴되서 채워지고, 그 후 부터는 fibonacci(3)을 계산하지 않고 dp[3]을 참조하여 값을 구할 수 있다. 이런식으로 계산량을 줄여 알고리즘을 짤 수 있다.
백준 관련문제 : 2747번 문제: 피보나치 수, 2748번 문제: 피보나치 수 2, 2749번 문제: 피보나치 수 3 , 11444번 문제: 피보나치 수 6
2748번 문제: 피보나치 수 2 의 경우, 범위 때문에 long long 타입을 사용해야한다.