Skip to content

Commit 2da7d89

Browse files
committed
add Matrix chain multiplication algorithm
1 parent 42bed57 commit 2da7d89

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import java.util.ArrayList;
2+
import java.util.Scanner;
3+
4+
public class MatrixChainMultiplicationTest {
5+
private static Scanner scan = new Scanner(System.in);
6+
private static ArrayList<Matrix> mArray = new ArrayList<>();
7+
private static int size;
8+
private static int[][] m;
9+
private static int[][] s;
10+
private static int[] p;
11+
12+
public static void main(String[] args) {
13+
int count = 1;
14+
while(true) {
15+
String [] mSize = input("input size of matrix A("+count+") ( ex. 10 20 ) : ");
16+
int col = Integer.parseInt(mSize[0]);
17+
if (col==0) break;
18+
int row = Integer.parseInt(mSize[1]);
19+
20+
Matrix matrix = new Matrix(count, col, row);
21+
mArray.add(matrix);
22+
count++;
23+
}
24+
for(Matrix m : mArray) {
25+
System.out.format("A(%d) = %2d x %2d\n", m.count(), m.col(), m.row());
26+
}
27+
28+
size = mArray.size();
29+
m = new int[size + 1][size + 1];
30+
s = new int[size + 1][size + 1];
31+
p = new int[size + 1];
32+
33+
for (int i=0; i<size+1; i++) {
34+
for (int j=0; j<size+1; j++) {
35+
m[i][j] = -1;
36+
s[i][j] = -1;
37+
}
38+
}
39+
40+
for (int i=0; i<p.length; i++) {
41+
if (i == 0) {
42+
p[i] = mArray.get(i).col();
43+
} else {
44+
p[i] = mArray.get(i-1).row();
45+
}
46+
}
47+
48+
matrixChainOrder();
49+
for(int i=0; i<size; i++) { System.out.print("-------"); }
50+
System.out.println();
51+
printArray(m);
52+
for(int i=0; i<size; i++) { System.out.print("-------"); }
53+
System.out.println();
54+
printArray(s);
55+
for(int i=0; i<size; i++) { System.out.print("-------"); }
56+
System.out.println();
57+
58+
System.out.println("Optimal solution : "+ m[1][size]);
59+
System.out.print("Optimal parens : ");
60+
printOptimalParens(1, size);
61+
}
62+
private static void printOptimalParens(int i, int j) {
63+
if (i == j) {
64+
System.out.print("A" + i);
65+
} else {
66+
System.out.print("(");
67+
printOptimalParens(i, s[i][j]);
68+
printOptimalParens(s[i][j] + 1, j);
69+
System.out.print(")");
70+
}
71+
}
72+
private static void printArray(int[][] array) {
73+
for (int i = 1; i < size+1; i++) {
74+
for (int j = 1; j < size+1; j++) {
75+
System.out.print(String.format("%7d", array[i][j]));
76+
}
77+
System.out.println();
78+
}
79+
}
80+
81+
private static void matrixChainOrder() {
82+
for (int i = 1; i<size+1; i++) {
83+
m[i][i] = 0;
84+
}
85+
86+
for (int l = 2; l <size+1; l++) {
87+
for (int i = 1; i<size-l+2; i++) {
88+
int j = i+l-1;
89+
m[i][j] = Integer.MAX_VALUE;
90+
91+
for (int k = i; k < j; k++) {
92+
int q = m[i][k] + m[k+1][j] + p[i-1] * p[k] * p[j];
93+
if (q < m[i][j]) {
94+
m[i][j] = q;
95+
s[i][j] = k;
96+
}
97+
}
98+
}
99+
}
100+
}
101+
102+
private static String[] input(String string) {
103+
System.out.print(string);
104+
return (scan.nextLine().split(" ") );
105+
}
106+
107+
}
108+
class Matrix {
109+
private int count;
110+
private int col;
111+
private int row;
112+
public Matrix(int count, int col, int row) {
113+
this.count = count;
114+
this.col = col;
115+
this.row = row;
116+
}
117+
public int count() { return this.count; }
118+
public int col() { return this.col; }
119+
public int row() { return this.row; }
120+
}

0 commit comments

Comments
 (0)