1
+
1
2
#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 [])
5
7
{
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 ;
8
13
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 );
29
33
}
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
40
45
}
41
46
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 ;
63
58
}
0 commit comments