*Optimal Substructure
다이나믹 프로그래밍에서 각 문제는 한 번만 풀어야 한다.
Optimal Substructure를 만족하기 때문에, 문제에 대한 정답이 변하지 않음.
정답을 한 번 구했으면, 정답을 어딘가에 메모해놓는다.
이런 메모를 배열에 저장하면 됨.
메모를 한다고해서 Memoization이라고 함.
1) 모든 문제를 풀어야 함.
2) 모든 문제는 1번만 풀어야 함.
시간복잡도 = 문제의 개수 * 문제 1개를 푸는 시간
-> O(N)
1.Top-down
어떤 문제를 풀기 위해서 문제를 작은문제로 쪼갬.
작은문제로 나눌 수 있으면 또 나눔.
가장 작은 크기의 문제로 나누어졌을 때 return 하면서 원래문제를 풀다가 가장 큰 문제를 푸는 방식임.
주로 재귀함수 이용.
2.Bottom-up
모든 문제의 경우에는 가장 작은 문제가 있음.
가장 작은 문제로 그 다음 문제,, 그리고 그 다음.
작은 것 부터 하나씩 푸는 방식임.
반복문을 이용.
1) 점화식의 정의.
코드가 아니라 글로 작성함.
D[N] = N번째 피보나치 수.
2) 문제를 작게 만들 수 있는 방법을 찾아야 함.
N번째 피보나치 수는 N-1번째와 N-2번째를 합쳐서 만든다.
최백준 선생님의 코딩테스트 기초 강의를 보고 작성한 글입니다.