1. 问题
给定n个矩阵的链<A 1 ,A 2 ,…,A n >,通过适当的划分矩阵链乘法顺序使得相乘次数最少
2. 解析
可以通过动态规划自小而多推导出最少的相乘次数;
先定义一个二维数组m[][],这个数组的每个坐标m[a]b意味着在a->b的范围中的最小相乘次数;
我们从最底下开始考虑,当a==b时,乘数为0初始化数组m[a][a]=0;
a!=b时有动态规划方程m[a][b]=min{m[a][k]+m[k+1][b]+pa-1pkpb}(k=a->b)
在逐渐加大ab间距循环就可以轻松的保存所有的状态了;
3. 设计
#include<iostream>
using namespace std;
int n,m[100][100],p[100];
void chain() {
for (int i = 1; i <= n; i++) {
m[i][i] = 0;
}
int l = 0;
int i = 0;
int j = 0;
int tmp = 0;
for (l = 2; l <= n; l++) {
for (i = 1; i <= n - l + 1; i++) {
j = i + l - 1;
m[i][j] = m[i][i] + m[i + 1][j] + p[i - 1] * p[i] * p[j];
for (int k = i + 1; k < j; k++) {
tmp = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (tmp < m[i][j]) {
m[i][j] = tmp;
}
}
}
}
}
int main() {
cout << "输入矩阵长度:";
cin >> n;
cout << "输入矩阵:";
for (int i = 0; i <= n; i++) {
cin >> p[i];
}
chain();
cout <<"最少相乘次数:"<< m[1][n];
return 0;
}
4. 分析
T(n)=k(0->n)(n-k)(k!)=
5. 源码
https://github.com/Bcxx/task_code/tree/master/JZchain