#include <stdio.h>
void print_optimal_parens(int n,int (*s)[n+1],int i,int j);
void matrix_order_optimal(int * p,int n,int (*m)[n+1],int (*s)[n+1]);
int main(void)
{ const int d_size=7;
int p[d_size]={30,35,15,5,10,20,25};
int m[d_size][d_size];
int s[d_size][d_size];
matrix_order_optimal(p,d_size-1,m,s);
printf("%d\n",m[1][d_size-1]);
print_optimal_parens( d_size-1,s,1,d_size-1);
putchar('\n');
}
void matrix_order_optimal(int * p,int n,int (*m)[n+1],int (*s)[n+1])
{ for(int i=1;i<=n;i++)
m[i][i]=0;
for(int l=2;l<=n;l++)
{ for(int i=1;i<=n-l+1;i++)
{ int j=i+l-1;
m[i][j]=100000000;
for(int k=i;k<=j-1;k++)
{ int q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(q<m[i][j])
{ m[i][j]=q;
s[i][j]=k;
}
}
}
}
}
void print_optimal_parens(int n,int (*s)[n+1],int i,int j)
{ if(i==j)
printf("A%d",i);
else
{ printf("(");
print_optimal_parens(n,s,i,s[i][j]);
print_optimal_parens(n,s,s[i][j]+1,j);
printf(")");
}
}