Matrix Chain Multiplication (Dynamic Programming)
Problem statement: Given a chain of n matrices (A1 A2 A3 ..... An), matrix Ai has dimension ( pi-1 x pi ) fully parenthesize the product A1A2A3......An in a way that minimizes the number of scalar multiplication.
The program below is one of the best ways to do so.
#define INF 2143483647
#define MAX 20
int m[MAX][MAX],s[MAX][MAX];
int lookup_chain(int *p,int i,int j){
int k,q=0;
if(m[i][j]<INF)
return m[i][j];
if(i==j)
m[i][j]=0;
else{
for(k=i;k<j;k++){
q=lookup_chain(p,i,k)+lookup_chain(p,k+1,j)+p[i-1]*p[k]*p[j];
if(q<m[i][j]){
m[i][j]=q;
s[i][j]=k;
}
}
}
return m[i][j];
}
void print(int i,int j){
if(i==j)
printf("A%d",i);
else{
printf("(");
print(i,s[i][j]);
print(s[i][j]+1,j);
printf(")");
}
}
int main(){
int p[]={40,20,30,10,30};
int i,j,n;
n=sizeof(p)/sizeof(p[0]);
for(i=0;i<n;i++)
for(j=i;j<n;j++)
m[i][j]=INF;
printf("Scalar Multiplications: %d\n\n",lookup_chain(p,1,n-1));
printf("Multiplication Order: ");
print(1,n-1);
return 0;
}
Output:

No comments:
Post a Comment