C语言动态规划矩阵连乘代码
时间: 2023-05-29 22:04:52 浏览: 118
模拟退火法
5星 · 资源好评率100%
以下是矩阵连乘的动态规划实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
int p[MAX_SIZE + 1]; // 矩阵的行列数
int m[MAX_SIZE][MAX_SIZE]; // 存储最小计算次数的矩阵
int s[MAX_SIZE][MAX_SIZE]; // 存储最小计算次数时的分割点
// 计算最小计算次数的函数
int matrixChainOrder(int n) {
int i, j, k, L, q;
for (i = 1; i <= n; i++) {
m[i][i] = 0; // 对角线为0(一个矩阵的计算次数为0)
}
for (L = 2; L <= n; L++) { // L为矩阵链的长度(从2开始)
for (i = 1; i <= n - L + 1; i++) {
j = i + L - 1;
m[i][j] = 2147483647; // 初始化为最大值
for (k = i; k <= j - 1; k++) {
q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j]) {
m[i][j] = q;
s[i][j] = k; // 记录最小计算次数时的分割点
}
}
}
}
return m[1][n]; // 返回最小计算次数
}
// 输出最优解的函数
void printOptimalParens(int i, int j) {
if (i == j) {
printf("A%d", i); // 只有一个矩阵
} else {
printf("(");
printOptimalParens(i, s[i][j]);
printOptimalParens(s[i][j] + 1, j);
printf(")");
}
}
int main() {
int n, i;
printf("请输入矩阵个数:");
scanf("%d", &n);
printf("请依次输入矩阵的行列数:\n");
for (i = 0; i <= n; i++) {
scanf("%d", &p[i]);
}
printf("最小计算次数为:%d\n", matrixChainOrder(n));
printf("最优解为:");
printOptimalParens(1, n);
printf("\n");
return 0;
}
```
使用方法:
1. 在终端中输入 `gcc matrix_chain.c -o matrix_chain` 进行编译。
2. 在终端中输入 `./matrix_chain` 运行程序。
3. 按要求输入矩阵个数和矩阵的行列数。
4. 程序将输出最小计算次数和最优解。
阅读全文