-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchain_matrix_mult.py
50 lines (40 loc) · 1.18 KB
/
chain_matrix_mult.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import math
INF = math.inf
p = [10, 100, 5, 50]
p = [30, 35, 15, 5, 10, 20, 25]
num_matrices = len(p) - 1
m = [[INF for _ in range(num_matrices)] for _ in range(num_matrices)]
n = [[INF for _ in range(num_matrices)] for _ in range(num_matrices)]
for i in range(num_matrices):
m[i][i] = 0
# i = first index into m
# j = second index into m
def find_optimal_structure(i, j):
if i == j:
return 0
elif m[i][j] != INF:
return m[i][j]
else:
# opt = m[i][j]
for k in range(i, j):
cost = find_optimal_structure(i, k) + find_optimal_structure(k + 1, j) + p[i]*p[k+1]*p[j+1]
if i == 2 and j == 5:
print("i,k: {}; k+1,j: {}; pqr: {}".format(find_optimal_structure(i, k), find_optimal_structure(k + 1, j), p[i]*p[k+1]*p[j+1]))
print("i: {}, j: {}, k: {}".format(i,j,k))
print("cost: {}".format(cost))
if cost < m[i][j]:
m[i][j] = cost
n[i][j] = k
# n[i][j] = best_k
# m[i][j] = opt
return cost
def find_optimal_solution(i, j):
if i == j:
print("A{}".format(i))
else:
print("(")
find_optimal_solution(i, n[i][j])
find_optimal_solution(n[i][j] + 1, j)
print(")")
find_optimal_structure(0, num_matrices-1)
# find_optimal_solution(0, num_matrices-1)