动态规划求解6矩阵连乘问题,知道矩阵维数,求最少乘法次数以及最佳连乘次序c语言完整代码
时间: 2023-08-10 12:41:33 浏览: 72
动态规划C语言矩阵连乘
3星 · 编辑精心推荐
好的,以下是动态规划求解6矩阵连乘问题的C语言完整代码,包括求解最少乘法次数和最佳连乘次序:
```
#include <stdio.h>
#define N 6
// dp数组保存最少乘法次数
int dp[N][N];
// s数组保存最佳连乘次序
int s[N][N];
// 矩阵维数
int p[N+1] = {30, 35, 15, 5, 10, 20, 25};
// 动态规划求解
void matrix_chain_order() {
int n = N - 1;
for (int i = 1; i <= n; i++) {
dp[i][i] = 0;
}
for (int l = 2; l <= n; l++) {
for (int i = 1; i <= n-l+1; i++) {
int j = i + l - 1;
dp[i][j] = 0x7fffffff;
for (int k = i; k <= j-1; k++) {
int q = dp[i][k] + dp[k+1][j] + p[i-1]*p[k]*p[j];
if (q < dp[i][j]) {
dp[i][j] = q;
s[i][j] = k;
}
}
}
}
}
// 输出最少乘法次数和最佳连乘次序
void print_optimal_parens(int i, int j) {
if (i == j) {
printf("A%d", i);
} else {
printf("(");
print_optimal_parens(i, s[i][j]);
print_optimal_parens(s[i][j]+1, j);
printf(")");
}
}
int main() {
matrix_chain_order();
printf("最少乘法次数:%d\n", dp[1][N-1]);
printf("最佳连乘次序:");
print_optimal_parens(1, N-1);
printf("\n");
return 0;
}
```
其中,dp数组保存最少乘法次数,s数组保存最佳连乘次序,p数组保存矩阵维数。在`matrix_chain_order`函数中,利用一个三重循环来求解最少乘法次数和最佳连乘次序。在`print_optimal_parens`函数中,利用递归输出最佳连乘次序。
注意:这里的代码只是一个简单的示例,可以根据实际情况进行修改。同时,这里只是输出了最少乘法次数和最佳连乘次序,如果需要输出具体的乘法过程,可以再进行修改。
阅读全文