用c++写一个矩阵连乘并且给代码注释
时间: 2023-08-12 11:06:31 浏览: 91
好的,以下是用C++实现矩阵连乘的代码,并添加了注释:
```c++
#include<iostream>
using namespace std;
const int MAXN = 205; // 最大矩阵数量的上限
const int INF = 0x3f3f3f3f; // 无穷大
int n; // 矩阵数量
int m[MAXN][MAXN], s[MAXN][MAXN], p[MAXN]; // m、s、p 分别表示最小计算量矩阵、最优计算顺序矩阵、矩阵大小数组
// 动态规划求解最小计算量和最优计算顺序
void matrix_chain_order(){
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] = INF; // 初始化最小计算量
for(int k=i; k<j; k++){ // 枚举断点
int tmp = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]; // 计算最小计算量
if(tmp < m[i][j]){ // 更新最小计算量和最优计算顺序
m[i][j] = tmp;
s[i][j] = k;
}
}
}
}
}
// 输出最优计算顺序
void print_optimal_parens(int i, int j){
if(i == j) cout<<'A'<<i; // 如果只有一个矩阵,直接输出矩阵名称
else{
cout<<'('; // 输出左括号
print_optimal_parens(i, s[i][j]); // 递归输出左子树
print_optimal_parens(s[i][j]+1, j); // 递归输出右子树
cout<<')'; // 输出右括号
}
}
int main(){
cin>>n; // 输入矩阵数量
for(int i=0; i<=n; i++) cin>>p[i]; // 输入矩阵大小
matrix_chain_order(); // 动态规划求解最小计算量和最优计算顺序
cout<<m[1][n]<<endl; // 输出最小计算量
print_optimal_parens(1, n); // 输出最优计算顺序
return 0;
}
```
该程序的输入格式为:
第一行为矩阵的数量 $n$;
第二行为 $n+1$ 个整数 $p_0, p_1, ..., p_n$,表示矩阵的大小;
输出格式为:
第一行为最小计算量;
第二行为最优计算顺序。
例如,对于输入数据:
```
6
30 35 15 5 10 20 25
```
程序的输出为:
```
15125
((A1(A2A3))((A4A5)A6))
```
阅读全文