Skip to content

Commit fd683c0

Browse files
New Commit
1 parent 04d9936 commit fd683c0

File tree

2 files changed

+51
-56
lines changed

2 files changed

+51
-56
lines changed

matrix_chain_multi.c

Lines changed: 51 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,58 @@
1+
12
#include<stdio.h>
2-
#define inf 99999
3-
int n;
4-
int Chain_multi(int P[], int n) // P is the array of dimensions
3+
#include<limits.h>
4+
int N;
5+
void PrintOptimalParens(int s[][N], int i, int j);
6+
void MatrixChainOrder(int p[])
57
{
6-
int m[n][n];
7-
int i, j, k, L, q;
8+
int n = N - 1;
9+
int m[n+1][n+1], s[n+1][n+1];
10+
int i, l, j, k, q;
11+
for(i=1;i<=n;i++)
12+
m[i][i] = 0;
813

9-
for (i = 1; i < n; i++)
10-
m[i][i] = 0;
11-
12-
for (L = 2; L < n; L++) {
13-
for (i = 1; i < n - L + 1; i++)
14-
{
15-
j = i + L - 1;
16-
m[i][j] = inf;
17-
for (k = i; k <= j - 1; k++)
18-
{
19-
// q = cost/scalar multiplications
20-
q = m[i][k] + m[k + 1][j]
21-
+ P[i - 1] * P[k] * P[j];
22-
if (q < m[i][j])
23-
m[i][j] = q;
24-
}
25-
}
26-
}
27-
28-
return m[1][n - 1];
14+
for(l=2;l<=n;l++)
15+
{
16+
for(i=1;i<=n-l+1;i++)
17+
{
18+
j = i+l-1;
19+
m[i][j] = INT_MAX;
20+
for(k=i;k<j;k++)
21+
{
22+
q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
23+
if(q<m[i][j])
24+
{
25+
m[i][j] = q;
26+
s[i][j] = k;
27+
}//if
28+
}//k loop
29+
}//i loop
30+
}//l loop
31+
printf("Minimum number of scalar multiplications: %d\n", m[1][n]);
32+
PrintOptimalParens(s, 1, n);
2933
}
30-
31-
void print_Optimal_parens(int s[n-1][n-1], int i, int j){
32-
if(i==j)
33-
printf("A%d", i);
34-
else{
35-
printf("(");
36-
print_Optimal_parens(s, i, s[i][j]);
37-
print_Optimal_parens(s, s[i][j]+1, j);
38-
printf(")");
39-
}
34+
void PrintOptimalParens(int s[][N], int i, int j)
35+
{
36+
if(i==j)
37+
printf("A%d ", i);
38+
else
39+
{
40+
printf("(");
41+
PrintOptimalParens(s, i, s[i][j]);
42+
PrintOptimalParens(s, s[i][j]+1, j);
43+
printf(")");
44+
}//else
4045
}
4146

42-
int main(){
43-
int n, i, dim1, dim2;
44-
printf("Enter number of matrices: ");
45-
scanf("%d", &n);
46-
int P[n+1];
47-
printf("Enter dimensions of the matrices\n");
48-
for(i=0;i<n;i++){
49-
printf("Matrix A%d: ", i+1);
50-
scanf("%d %d", &dim1, &dim2);
51-
52-
P[i] = dim1;
53-
P[i+1] = dim2;
54-
}
55-
56-
for(i = 0; i<n+1; i++)printf("%d ", P[i]);
57-
printf("\n");
58-
int s[n-1][n-1];
59-
int m = Chain_multi(P, n+1);
60-
printf("\nMinimum number of multiplications = %d\n", m);
61-
// print_Optimal_parens(s, 1, n);
62-
return 0;
47+
int main()
48+
{
49+
int i;
50+
printf("Enter number of dimensions: ");
51+
scanf("%d", &N);
52+
int p[N];
53+
printf("Enter dimensions:\n");
54+
for(i=0;i<N;i++)
55+
scanf("%d", &p[i]);
56+
MatrixChainOrder(p);
57+
return 0;
6358
}

matrix_chain_multi.exe

3 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)