矩阵连乘
递归
int matrixchain(int i, int j, int p[])
{
if (i == j)
{
return 0;
}
else
{
int k = i;
int t = matrixchain(i, k, p) + matrixchain(k+1, j, p)+ p[i - 1] * p[k] * p[j];
for (k = i + 1;k < j;++k)
{
int mt= matrixchain(i, k, p) + matrixchain(k+1, j, p) + p[i - 1] * p[k] * p[j];
if (t > mt)
{
t = mt;
}
}
return t;
}
}
int main()
{
const int n = 6;
int p[n + 1] = { 30,35,15,5,10,20,25 };
int smin = matrixchain(1, 6, p);
cout << smin << endl;
return 0;
}
非递归
A1 A2 A3 A4 A5 A6
从上往下依次算
1 2 3 4 5 6
12 23 34 45 56
123 234 345 456
1234 2345 3456
12345 23456
123456
void Print_Vec(vector<vector<int>>& m)
{
int n = m.size();
for (int i = 0;i < n;++i)
{
for (int j = 0;j < n;++j)
{
printf("%7d", m[i][j]);
}
printf("\n");
}
printf("\n");
}
void back(int i, int j, vector<vector<int>>& s)
{
if (i == j)return;
else
{
back(i, s[i][j], s);
back(s[i][j] + 1, j, s);
cout << "Mulpity A" << i << "," << s[i][j] << "and A" << s[i][j] + 1 << "," << j << endl;
}
}
int matrixchain_1(int p[], int n, vector<vector<int>>& m,vector<vector<int>>& s)
{
for (int i = 1;i <= n;++i)m[i][i] = 0;
for (int num = 2;num <= 6;++num)
{
Print_Vec(m);
for (int i = 1;i <= n - num + 1;++i)//长度为2.3.4.5.6时候有几种数据长度
{
int j = i + num - 1;
m[i][j] = m[i][i] + 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 (m[i][j] > t)
{
m[i][j] = t;
s[i][j] = k;
}
}
}
}
return m[1][n];
}
int main()
{
const int n = 6;
int p[n + 1] = { 30,35,15,5,10,20,25 };
vector<vector<int>> s(n + 1, vector<int>(n + 1, 0));;//n+1个vector<int>(n+1,0)这样的数组
vector<vector<int>> m(n + 1, vector<int>(n + 1, 0));;
int smin = matrixchain_1(p, n,m ,s);
Print_Vec(m);
Print_Vec(s);
back(1, n, s);
cout << smin << endl;
return 0;
}