DP
DP 문제 접근 방식
a) 첫 번째 규칙 - 큰 문제를 작은 문제로 표현할 수 있다.
f(3) = f(2) + f(1)
f(5) = f(4) + f(3)
f(7) = f(6) + f(5)
위의 예시를 보면, f(3)이라는 큰 문제를 f(2)와 f(1)이라는 작은 문제로 나누었다.
f(5)라는 큰 문제를 f(4)와 f(5)라는 작은 문제로 나누었다.
f(7)이라는 큰 문제를 f(6)과 f(5)라는 작은 문제로 나누었다.
이와 같이 하나의 큰 문제를 작은 문제로 표현할 수 있어야 DP를 적용할 수 있다.
즉, 하나의 큰 문제를 해결하기 위해서는 이를 구성하는 작은 문제의 계산 값을 알아야 한다.
b) 두 번째 규칙 - 점화식
f(n) = f(n-1) + f(n-2)
c) 세 번째 규칙 - Memoization (Optional)
Memoization이란 컴퓨터 프로그램에서 동일한 계산을 반복(= 중복)해서 수행하는 경우 반복되는 동일한 연산의 값을
메모리에 저장하여 중복 계산을 제거함으로써 프로그램의 속도를 빠르게 하는 기술 또는 방법론을 의미한다.
즉, 캐싱(Caching)이다.
DP에서도 이 방법론이 사용된다. 그러나 이는 선택적으로 사용한다.
그 이유는 조금 있다가 알아보고, 아래의 예시를 보자.
f(5) = f(4) + f(3)
f(4) = f(3) + f(2)
f(3) = f(2) + f(1)
f(5) = f(4) + f(3)
f(4) = f(3) + f(2)
f(3) = f(2) + f(1)
f(5) = f(3) + f(2) + f(2) + f(1)
= f(2) + f(1)+ f(2) + f(2) + f(1)
d) 네 번째 규칙 - 테이블의 사용
앞서 DP는 memoization을 사용한다고 설명하였다.
그렇다면 어디에 중복되는 연산의 값을 저장할까?
이 저장 공간을 테이블이라고 표현한다.
테이블은 특별한 것이 아니다.
어떤 형태로든 중복되는 연산의 값을 저장하고 필요할 때 찾아서 사용할 수 있으면 된다.
대표적으로 단일 또는 이중 배열, 리스트, 필요에 따라서는 HashMap으로 구현된다.
DP의 풀이 방식
a) DP의 풀이 방식
b) Bottom-up 방식
어떤 글을 읽고 내용을 설명해야 한다고 해보자.
위에서 아래로 순차적으로 글을 읽고 내용을 이해한다.
이처럼 Bottom-up 방식은 데이터가 들어오는 순서대로 처리하는 과정을 사용한다.
대표적인 예시로, 위에서 구현한 피보나치 코드가 Bottom-up 방식이다.
즉, 1번째 숫자부터 N번째 숫자까지 차근차근 구하는 방식이다.
그러므로 반복문을 사용한 순차적인 DP 풀이를 Bottom-up 방식이라고 한다.
c) Top-down 방식
어떤 글을 읽고 내용을 설명해야 한다고 해보자.
주어진 글이 너무 길어서 각 문단의 앞부분만 읽고 전체적인 맥락을 이해한다.
이처럼 Top-down 방식은 어떤 패턴을 이용하는 과정을 사용한다.
즉, 재귀 함수를 이용하여 답을 찾는 방식이다.
그러므로 Recursion & Memoization을 사용한 DP 풀이를 Top-down 방식이라고 한다.
출처: https://devraphy.tistory.com/627 [개발자를 향하여:티스토리]