행렬이 세 개 있다고 하자.
A, B, C 행렬 시퀀스가 있고 각각 크기는 (5x1), (1x7), (7x8) 이다.
이 때 A와 B를 먼저 곱할 경우 그 비용은 (5x1x7) + (5x7x8) = 315 이다.
그런데 B와 C를 먼저 곱할 경우 그 비용은 (1x7x8) + (5x1x8) = 96 이다.
즉 같은 행렬 시퀀스에서도 어떤 걸 먼저 곱하느냐에 따라 비용이 달라진다.
Dynamic Programming을 통해 어떤 순서로 곱해야 가장 적은 비용이 드는지 알아낼 수 있다.
마지막 곱하기에 집중하는 것이 핵심이다.
Mi부터 Mk까지의 최소 비용 + (마지막 곱하는 비용) + Mk+1부터 Mj까지의 최소 비용
= Di,j + (di x dk x dj) + Dk+1,j
모든 가능한 i,j에 대하여 모든 Di,j를 계산하면 약 n^2개의 경우의 수가 있다.
int M(int d[], int n)
{
int D[n+1][n+1];
for(int i=1; i<=n; i++)
D[i][i] = 0;
for(int s=1; s<=n-1; s++)
{
minval = INF;
for(int k=i; k<=i+s-1; k++)
{
minval = min(minval, D[i][k]+D[k+1][i+s]+d[i-1]*d[k]*d[i+s]);
}
D[i][i+s] = minval;
}
return D[1][n];
}
이건 왜 DP인가?
이해하려고 n번째 보는 중인데 어지럽다,,