๐ฉ n๊ฐ์ ํ๋ ฌ์ ์ฐ์์ ์ผ๋ก ๊ณฑํ ๋ ์ต์์ ๊ธฐ๋ณธ ๊ณฑ์ ํ์๋ฅผ ๊ฐ๋ ํ๋ ฌ์ ๊ณฑ์ ์์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
i x j ํ๋ ฌ๊ณผ j x k ํ๋ ฌ์ ๊ณฑํ๊ธฐ ์ํด์๋ i x j x k ๋ฒ ๋งํผ์ ๊ณฑ์ ์ด ํ์ํ๋ค.
์ฐ์์ ์ผ๋ก ํ๋ ฌ์ ๊ณฑํ ๋ ์ด๋ค ํ๋ ฌ์ ๋จผ์ ์ํํ๋๋์ ๋ฐ๋ผ์ ํ์ํ ์ด ๊ณฑ์ ์ ํ์๊ฐ ๋ฌ๋ผ์ง๋ค.
๐ฉ ์ฐ์ํ๋ ฌ
ํ๋ ฌ์ ๊ณฑ์ ์ ์๋์ ๊ฐ์ด ๊ฒฐํฉ๋ฒ์น์ด ์ฑ๋ฆฝํ๋ค.
A x (B x C) = (A x B) x C
๊ทธ๋ฌ๋, ํ๋ ฌ์ ๊ณฑํ๋ ์์์ ๋ฐ๋ผ ๊ณฑํ๋ ํ์๊ฐ ๋ฌ๋ผ์ง๋ค.
๐ ์ฆ, ์ฐ์ํ๋ ฌ ์ต์๊ณฑ์ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ ฌ๊ณฑ์ ์์ ๊ณฑํ๋ ์์์ ๋ฐ๋ผ ๊ณฑ์ ์ ํ์๊ฐ ๋ฌ๋ผ์ง๋๋ฐ ์ด๋ฌํ ๋ฒ์น์ ์ด์ฉํ์ฌ ์ต์๋ก ๊ณฑํ๋ ํ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค.
์ฐ์ํ๋ ฌ ์ต์๊ณฑ์ ์๊ณ ๋ฆฌ์ฆ ์ฌ๊ท๊ด๊ณ์
โจ ์์ ๋ก ์ดํดํ๋ฉด ์ฝ๊ฒ ์ดํด ๊ฐ๋ฅ!
EX) A(20x1),B(1x30),C(30x10),D(10x10) ์ผ๋, d0=20, d1=1, d2=30, d3=10, d4=10
1. M[1][2] (ํ๋ ฌ A~B๊น์ง์ ๊ณฑ์ ํ์) (1<=k<=1)
= minimum(M[1][k] + M[k+1][2] + d0*dk*d2
= M[1][1] + M[2][2] + d0*d1*d2
= 0 + 0 + 20*1*30
= 600
2. M[2][3](ํ๋ ฌ B~C๊น์ง์ ๊ณฑ์ ํ์) (2<=k<=2)
= minimum(M[2][k] + M[k+1][3] + d1*dk*d3)
= M[2][2] + M[3][3] + d1*d2*d3
= 0+0+1*30*10
= 300
3. M[1][3](ํ๋ ฌ A~C๊น์ง์ ๊ณฑ์ ํ์)(1<=k<=2)
= minimum(M[1][k] + M[k+1][3] +d0*dk*d2
= minimum(M[1][1] + M[2][3] + d0*d1*d3, M[1][2] + M[3][3] + d0*d2*d3)
= minimum(0 + 300+20*1*10, 600+0+20*30*10)
= minimum(500, 6600)
= 500
ํ๋ ฌ A~D๊น์ง์ ๊ณฑ์ ํ์ (M[1][4])๋
M[1][4] = minimum( M[1][1] + M[2][4] + d0*d1*d4, M[1][2] + M[3][4] + d0*d2*d4, M[1][3] + M[4][4] + d0*d3*d4)
M[1][4]๋ฅผ ๊ตฌํ๋ ค๋ฉด
M[1][1]~M[1][4]์ ๊ฐ์ด ํ์ํ๊ณ ,(๊ตฌํ๋ ค๋ ๊ฐ์ ํ
์ด๋ธ ์ข์ธก๊ฐ)
M[2][4]~M[4][4]์ ๊ฐ์ด ํ์ํ๊ณ ,(๊ตฌํ๋ ค๋ ๊ฐ์ ํ
์ด๋ธ ์๋ซ๊ฐ)
๐ฉ ์๊ฐ๋ณต์ก๋
O(N^3)
cf. ์ต์ ์ ํ๋ ฌ ๊ณฑ์ ์์๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ O(n)
๋๋ ๋ถ๋ถ์ด ํ๋์ฉ ์ค์ด๋๋๋ฐ, n๊ฐ ํ๋ ฌ์ ๊ณฑ์ ์์์์๋ n-2๋ฒ์ ๋ถํ ์ง์ ์ด ํ์ํ๋ค. ๐ O(n)
๐ฉ ๊ตฌํ
#include<iostream>
using namespace std;
#define MIN(A, B) ((A)>(B)?(B):(A))
#define MAX_VALUE 9999999
#define MAX_SIZE 101
int M[MAX_SIZE][MAX_SIZE];
int d[MAX_SIZE];
int main(){
int size = 4;
d[0] = 20, d[1] = 1, d[2] = 30, d[3] = 10, d[4] = 10;
// ๊ตฌํ๋ ค๋ ํ๋ ฌ์ ์ฌ์ด์ฆ๋งํผ ๋ฐ๋ณตํ๋ค.
for (int diagonal = 0; diagonal < size; diagonal++) {
// i ๊ฐ์ ์๋จ 1๋ถํฐ ์์, ๋ฐ๋ณตํ๋ ํ์๊ฐ 1์ฉ ๊ฐ์ํ๋ค.
for (int i = 1; i <= size - diagonal; i++) {
// j๊ฐ์ ์ฐ์ธก๋ถํฐ diagnonal๋งํผ ๋ฐ๋ณตํ ๋๋ง๋ค ์ด๋ํ๋ค.
int j = i + diagonal;
if (j == i) { // i==j์ผ ๊ฒฝ์ฐ M[i][j] = 0
M[i][j] = 0;
continue;
}
// k = i~ j-1๋งํผ ๋ฐ๋ณตํ์ฌ, ๊ณต์์ ์ ์ฉํ์ฌ M[i][j]์ ๋ค์ด๊ฐ ๊ณฑ์ ์ต์๊ฐ์ ๊ตฌํ๋ค.
M[i][j] = MAX_VALUE;
for (int k = i; k <= j - 1; k++)
M[i][j] = MIN(M[i][j], M[i][k] + M[k + 1][j] + d[i - 1] * d[k] * d[j]);
}
}
/*๊ฒฐ๊ณผ ์ถ๋ ฅ*/
cout << M[1][size] << endl;
for (int i = 1; i <= size; i++) {
for (int j = 1; j <= size; j++) {
cout << M[i][j] << " ";
}
cout << endl;
}
return 0;
}
์๋ฃ ์ถ์ฒ
'๐ฉโ๐ป ํ๋ก๊ทธ๋๋ฐ > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ฃจํธ-ํฌ์ค ์๊ณ ๋ฆฌ์ฆ (0) | 2024.05.05 |
---|---|
์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(LCS) cf. ์ต์ฅ ๊ณตํต ๋ฌธ์์ด (0) | 2024.04.29 |
ํฌ๋-ํ์ปค์จ ์๊ณ ๋ฆฌ์ฆ(์ต๋ ์ ๋ ๋ฌธ์ ) (3) | 2024.04.19 |
ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ(์ต๋จ ๊ฒฝ๋ก) (0) | 2024.04.19 |
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ(์ต๋จ ๊ฒฝ๋ก) (0) | 2024.04.19 |