학교 수업/알고리즘

알고리즘 ch10 Dynamic Programming

컴영 2020. 6. 15. 19:29

Dynamic Programming

- 큰 문제를 작은 문제로 나눠서 푸는 문제

- Optimization problem 푸는 방법 중 하나이다.


  * divide and conquer과 다른점 : 메모리를 이용해 중복 계산을 하지 않는다.


- 풀이 과정

 ① 문제 특성을 파악

 ② 점화식 정의

 ③ 점화식대로 계산 수행


- 두가지 방식으로 나뉨

 1) Top-down 방식 : recursion -> memoization

 2) Bottom-up 방식 : Loop


- dp로 풀수있는 optimization problem 

  예시)

 Matrix-Chain Multiplication problem : 두 개 이상의 행렬의 순서가 주어질 때 행렬의 곱셈에서 곱셈 연산의 수를 최소화하는 방법을 찾는 것


행렬의 곱 ABCD 에 대해 행렬은 결합법칙이 성립하므로
((AB)C)D=((A(BC))D)=(AB)(CD)=A((BC)D)가 성립한다. 
이때 각각의 연산마다의 곱셈 연산의 횟수는 다르므로 이중에서 최소 연산 횟수를 가지는 방법을 찾아야 한다.

예를 들어 A=1030,B=305,C=560 의 크기를 가지는 행렬의 곱셈을 진행 할때
(AB)C=(10305)+(10560)=1500+3000=4500(count of operations)
A(BC)=(30560)+(103060)=9000+18000=27000(count of operations)
위처럼 괄호의 위치마다 연산의횟수는 크게 차이가 나기때문에 최적의 방법을 찾아내는것이 중요하다.


bottom up 방식을 이용해서 풀 것이다.

사용 점화식


M[i][j] = 행렬 i부터 j까지 행렬을 곱하는데 필요한 곱셈의 최소 횟수



시간복잡도 O(n^3)     공간복잡도 O(n^2)