C语言求矩阵链乘法。设 A1,A2,…,An 为矩阵序列,Ai 为 Pi-1×Pi 阶矩阵,i = 1,2,…,n. 确定乘法顺序使得元素相乘的总次数最少.
时间: 2024-01-17 17:04:19 浏览: 69
基于C语言的矩阵乘法
矩阵链乘法问题可以用动态规划算法解决。我们可以定义一个二维数组 m,其中 m[i][j] 表示从第 i 个矩阵到第 j 个矩阵所需的最小乘法次数。同时,我们还需要一个数组 s,其中 s[i][j] 表示从第 i 个矩阵到第 j 个矩阵的最优分割点,即在第 s[i][j] 个矩阵处分割,可以使得从 i 到 s[i][j] 和从 s[i][j]+1 到 j 两个子问题的乘法次数之和最小。
动态规划的状态转移方程为:
m[i][j] = min{m[i][k]+m[k+1][j]+P[i-1]*P[k]*P[j]}
其中,P[i] 表示第 i 个矩阵的行数,第 i+1 个矩阵的列数。
s[i][j] 的计算方法为:
s[i][j] = argmin{m[i][k]+m[k+1][j]+P[i-1]*P[k]*P[j]}
其中,argmin 表示取使其后面的式子最小的 k 值。
最终,我们可以通过递归的方式输出最优乘法顺序。具体实现可以参考下面的 C 语言代码:
```c
#include <stdio.h>
#define MAXN 100
void matrix_chain(int *P, int n, int m[][MAXN], int s[][MAXN]) {
int i, j, k, r, t;
for (i = 1; i <= n; i++) m[i][i] = 0;
for (r = 2; r <= n; r++) {
for (i = 1; i <= n-r+1; i++) {
j = i+r-1;
m[i][j] = m[i+1][j] + P[i-1]*P[i]*P[j];
s[i][j] = i;
for (k = i+1; k < j; k++) {
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;
}
}
}
}
}
void print_order(int s[][MAXN], int i, int j) {
if (i == j) printf("A%d", i);
else {
printf("(");
print_order(s, i, s[i][j]);
print_order(s, s[i][j]+1, j);
printf(")");
}
}
int main() {
int P[MAXN], n, m[MAXN][MAXN], s[MAXN][MAXN];
printf("输入矩阵数:");
scanf("%d", &n);
printf("输入矩阵规模:");
for (int i = 0; i <= n; i++) scanf("%d", &P[i]);
matrix_chain(P, n, m, s);
printf("最少乘法次数:%d\n", m[1][n]);
printf("最优乘法顺序:");
print_order(s, 1, n);
printf("\n");
return 0;
}
```
需要注意的是,以上代码中的矩阵序号从 1 开始,而不是从 0 开始。输入时需要输入 n 个矩阵的规模,其中第 i 个矩阵的行数为 P[i-1],列数为 P[i]。
阅读全文