# 矩阵连乘

#include<iostream>
#include<cstdlib>
using namespace std;
void MatrixChain(int *p,int n,int * *m,int * *s)
{
for(int i = 1;i <= n;i++)
m[i][i] = 0;
for(int r = 2;r <= n;r++)
for(int i = 1;i <= n - r + 1;i++)
{
int j = i + r - 1;
m[i][j] = m[i + 1][j] +p[i - 1] * p[i] *p[j];
s[i][j] = i;
for(int k = i + 1;k < j;k++)
{
int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] *p[j];
if(t < m[i][j])
{
m[i][j] = t;
s[i][j] = k;
}
}
}
cout <<"最少数乘次数为：" << m[1][n] << endl;
}
void Traceback(int i,int j,int **s)
{
if(i == j)
return ;
Traceback(i,s[i][j],s);
Traceback(s[i][j] + 1,j,s);
cout << "Multiply A" << i << "，" << s[i][j];
cout << "and A" << (s[i][j] + 1) << "，" << j << endl;
}
int main()
{
int n;
cin >> n;
int list[n + 1];
/*int** m = new int*[n+1];//动态数组的初始化方式1
m[0] = new int[(n+1)*(n+1)];
int** s = new int*[n+1];
s[0] = new int[(n+1)*(n+1)];
for(int i = 1; i < n+1; i ++)
{
m[i] = m[i-1] + n+1;
s[i] = s[i-1] + n+1;
}*/
int **s = new int *[n + 1];//动态数组的初始化方式二
int **m = new int *[n + 1];
for(int i=0;i< n + 1;i++)
{
s[i] = new int[n + 1];
m[i] = new int[n + 1];
}
for(int i = 0;i < n + 1;i++)
cin >> list[i];
if(n == 1)
cout << "计算次数为：0" << endl;
else
MatrixChain(list,n,m,s);
Traceback(1,n,s);
return 0;
}
/*
6
30 35 15 5 10 20 25
*/