하나의 큰 문제를 여러 개의 작은 문제로 나누고 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용
재귀는 동일한 문제를 여러번 반복해서 풀어야한다는 단점이 있는데 DP는 이전에 계산한 값을 사용할 수 있어 효율적임
부분문제가 반복되어 나타나지 않는다면 재사용이 불가능하여 부분문제가 중복되는 경우에 효율적
부분문제의 최적 결과값을 사용하여 전체 문제의 최적 결과를 낼 수 있는 경우를 의미
#include <iostream>
#include <vector>
using namespace std;
int fibonacci(int n) {
vector<int> dp(n + 1, 0); // 다이나믹 프로그래밍을 위한 배열
// 초기값 설정
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2]; // 이전 값들을 활용하여 현재 값을 구함
}
return dp[n];
}
int main() {
int n = 10; // 피보나치 수열의 n번째 항을 구함
cout << "피보나치 수열의 " << n << "번째 항: " << fibonacci(n) << endl;
return 0;
}