3. POSTECH Computer Algorithm Team
- DP는 Dynamic Programming의 약자이며, 동적 계획법이라고도 부른다.
- DP는 재귀(recursion)를 이용하여 최적화 솔루션을 얻어내는 방식을 사용한다.
- 알고리즘의 꽃이라고도 부르며, 쉬운 문제는 엄청 쉽지만 한없이 어렵게 낼 수도 있는 분야이다.
- DP는 부분 문제들이 DAG(Directed Acyclic Graph)의 형태면 적용할 수 있다.(?????)
DP란?
개요
4. POSTECH Computer Algorithm Team
개요
- 피보나치 수를 예시로 들자.
- F(n) = n번째 피보나치 수 라고 정의하자.
- F(n) = F(n – 1) + F(n – 2)
- 보시다시피 n번째 피보나치 수를 구할 때는 n – 1번째와 n – 2번째 피보나치 수를 이용한다.
Q) F(n-1), F(n-2)를 구할 때 F(n)이 필요한가?
5. POSTECH Computer Algorithm Team
개요
A) 필요가 없다.
- 만약 F(n-1) 또는 F(n-2)를 구하는데 F(n)이 필요하다면, 사이클이 생겨버린다.
- 하지만 피보나치 수는 그런 사이클이 생기지 않는다.
- 즉, 부분 문제들 사이에 사이클이 생기지 않는다.
6. POSTECH Computer Algorithm Team
개요
- 이제 피보나치 수는 사이클이 없는, DAG 모양의 문제라는 것을 알 수 있다.
- 이제 피보나치 수를 여러 개 구한다고 해보자. 5번째, 9번째, 3번째 등등…
- 원래대로라면 F(5) = F(4) + F(3) = F(3) + F(2) + F(2) + F(1) = 3 * F(2) + 2 * F(1) 로 구하고,
- F(9)나 F(3)도 F(1), F(2)가 나올 때까지 이런 계산 작업을 반복해야 한다.
Q) F(5)를 계산한 상태에서 F(9)나 F(3)를 효율적으로 계산할 수 없을까?
7. POSTECH Computer Algorithm Team
개요
A)
- F(5)를 계산하는 과정에서 F(1~4)도 계산한다.
- 즉, F(9)를 계산할 때 F(4)나 F(5)와 관련된 식이 나오면 바로 계산할 수 있다.
- F(3)도 마찬가지다.
- 이렇게 이미 계산한 부분 문제들을 이용하는 것을 “메모이제이션(memoization)”이라고 한다. Memorization과는
다르다!
Q) 만약 부분 문제들 사이에 사이클이 있으면 메모이제이션을 사용할 수 있을까?
8. POSTECH Computer Algorithm Team
1. 부분 문제를 정의한다. (F(n) = n번째 피보나치 수)
2. 부분 문제들과 관련된 점화식을 세운다. (F(n) = F(n – 1) + F(n – 2))
3. 초항(base case)에 대해 문제를 해결한다. (F(1) = F(2) = 1)
DP Solve
개요
11. Code Explanation
POSTECH Computer Algorithm Team
Code
int main(void){
int n, num[10000001];
cin >> n;
num[1] = 1;
num[2] = 1;
for(int i = 3; i <= n; i++){
num[i] = num[i-1] + num[i-2];
}
cout << num[n] << ‘n’;
}
피보나치 수(상향식)
12. POSTECH Computer Algorithm Team
구현
- 하향식은 점화식과 똑같이 구현하면 되기 때문에 구현 난이도가 낮다.
- 상햑식은 제일 작은 문제들부터 풀어나가는 식이기 때문에 점화식과는 방향이 반대여서, 구현이 어렵다.
- 다만 함수를 계속 부르는 하향식에 비해, 상향식이 성능이 더 좋다.
(물론 컴파일러 성능이 좋아진 현재, 의미가 없지만)
13. POSTECH Computer Algorithm Team
- https://www.acmicpc.net/problem/1463
- https://www.acmicpc.net/problem/9095
- https://www.acmicpc.net/problem/2579
연습 문제
연습 문제
14. POSTECH Computer Algorithm Team
- f(n) : n을 1로 만드는 최소 연산 수
- 점화식 : f(n) = min(f(n/3), f(n/2), f(n-1)) + 1
- Base cases : f(1) = 0, f(2) = 1, f(3) = 1
1로 만들기
연습 문제
15. POSTECH Computer Algorithm Team
- f(n) : 1, 2, 3으로 n을 만들 수 있는 방법의 수
- 점화식 : f(n) = f(n-1) + f(n-2) + f(n-3)
- Base cases : f(1) = 1, f(2) = 2, f(3) = 4
1, 2, 3 더하기
연습 문제
16. POSTECH Computer Algorithm Team
- f(n) : n번째 계단까지 쌓을 수 있는 최대 점수
- 점화식 : f(n) = s(n) + max(s(n-1) + f(n-3),f(n-2))
- Base cases : f(1) = s(1), f(2) = s(1) + s(2), f(3) = max(s(1), s(2)) + s(3)
계단 오르기
연습 문제