동적 계획법 예제 - 11
문제 분석
점화식을 구하기 막막할 때는 동적 계획법의 특징을 한 번 생각해보자.
부분 문제를 구해 큰 문제를 해결하는 방식이 동적 계획법의 특징 중 하나이다.
따라서 부분의 문제가 해결됐다고 가정하고, 점화식을 떠올려 보는 것도 점화식을 세울 수 있는 좋은 방법 중 하나이다.
행렬의
N이 주어지고,1 ~ N개를 모두 곱했을 때 최소 연산 횟수를 구해야 한다.만약
N개 이외의 부분 영역, 예를 들어1 ~ N - 1,2 ~ N,3 ~ N - 2등 N을 제외한 모든 부분 구역을 1개의 행렬로 만드는 데 필요한 최소 연산 횟수를 알고 있다고 가정해보자.이러한 가정을 바탕으로
1 ~ N구역의 최소 연산 횟수를 구해야 하는데, 먼저 점화식을 정의하면 이렇다.D[i][j]=i ~ j구간의 행렬을 합치는데 드는 최소 연산 횟수

dp[1][N - 1],dp[N][N]의 값을 안다고 가정했을 때 1개의 행렬로 합치는 데 드는 횟수는 다음과 같다.dp[1][N - 1]+dp[N][N]+aa는 두 행렬을 합치는 데 드는 값으로 예를 들어2 x 3과3 x 6행렬이 있다면2 x 3 x 6 = 36이다.
이러한 아이디어를 바탕으로 그림과 같이
dp[1][N]의 값을 찾는 식을 구할 수 있다.

손으로 풀어보기
행렬 구간에 행렬이 1개일 때는 0을 리턴한다. 행렬 구간에 행렬이 2개일 때는
앞 행렬의 row * 뒤 행렬의 row * 뒤 행렬의 col값을 리턴한다. 행렬 구간에 행렬이 3개 이상일 때는 다음 조건식의 결과를 리턴한다.행렬 구간에 행렬이 3개 이상일 때 조건식

구하려는 영역의 행렬 개수가 3개 이상일 때는 이 영역을 다시 재귀 형식으로 쪼개면서 계산하면 된다.
슈도코드
코드 구현 - 파이썬
코드 구현 - 자바
Last updated