
뭔데 이게?
동적계획법(Dynamic Programming)은 복잡한 문제를 간단한 여러개의 문제로 나누어 푸는 방법이다.
언제 쓰지?
왜 쓰지?
어떻게 쓰지?
1) 재귀호출
public class Fibonacci{
static int[] dp = new int[1000];
static int fibonacci(int n){
if(n == 0) return 0;
if(n == 1) return 1;
if(dp[n] != 0) return dp[n];
dp[n] = fibonacci(n - 2) + fibonacci(n - 1);
return dp[n];
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println(fibonacci(N));
}
}
2) 반복문 : for
public class Fibonacci{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] dp = new int[N + 1];
dp[1] = 1;
for(int i = 2;i <= N;i++)
dp[i] = dp[i - 1] + dp[i - 2];
System.out.println(dp[N]);
}
}
쓰면 뭐가 달라지지?
ex) 중복된 문제를 한번만 풀다보니 계산량이 급진적으로 감소한다.

피보나치의 경우
기본 함수 호출 : O(2^n)
DP : O(n)
항상 좋은건가?
출처: