Files
suanfa/public/c/ch3/matrix/matrixmul.c
T
2026-06-15 09:00:38 +08:00

46 lines
1.5 KiB
C

#include <stdio.h>
#include <limits.h>
void matrixChain(int p[], int m[][5], int s[][5], int n) {
for (int i = 1; i <= n; i++) {
m[i][i] = 0; // 初始化对角线
}
for (int d = 2; d <= n; d++) { // d为链的长度
for (int i = 1; i <= n - d + 1; i++) { // i是起始位置
int j = i + d - 1; // 结束位置
m[i][j] = INT_MAX; // 初始化为无穷大
for (int k = i; 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; // 记录划分位置
}
}
}
}
}
//输出A[i,j]的最优计算次序
void traceback(int i, int j, int s[][5]) {
if (i == j) {
printf("A%d", i); // 输出矩阵名
} else {
printf("(");
traceback(i, s[i][j], s); // 递归输出左边
traceback(s[i][j] + 1, j, s); // 递归输出右边
printf(")");
}
}
int main() {
int p[] = {6, 7, 8, 9, 10}; // 矩阵的维数
int n = sizeof(p) / sizeof(p[0]) - 1; // 矩阵个数
int m[6][5] = {0}; // 存放最优值的数组
int s[6][5] = {0}; // 存放分割位置下标的数组
matrixChain(p, m, s, n);
printf("最优值为: %d\n", m[1][n]); // 输出最优值
printf("最优计算次序为: ");
traceback(1, n, s); // 输出最优计算次序
return 0;
}