1、使用动态规划法求解最优的矩阵乘法计算顺序,使用括号输出最佳计算顺序。 测试用例:A(8*10)*B(10*3)*C(3*20)*D(20*4)*E(4*5)*F(5*3)请用C语言编写代码,输出A B C D E不要用A1 A2 A3 A4 A5 A6表示
时间: 2024-06-20 11:03:47 浏览: 75
动态规划法可以用来求解最优的矩阵乘法计算顺序,以减少乘法次数,提高计算效率。下面是使用C语言实现动态规划法求解最优的矩阵乘法计算顺序的代码,以及输出最佳计算顺序的括号表达式:
```
#include <stdio.h>
#define MAX 100
int p[MAX+1], m[MAX+1][MAX+1], s[MAX+1][MAX+1];
void matrix_chain_order(int n)
{
int i, j, k, l, q;
for (i=1; i<=n; i++)
m[i][i] = 0;
for (l=2; l<=n; l++) {
for (i=1; i<=n-l+1; i++) {
j = i+l-1;
m[i][j] = 0x7fffffff;
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;
}
}
}
}
}
void print_optimal_parens(int i, int j)
{
if (i == j) {
printf("%d", i);
} else {
printf("(");
print_optimal_parens(i, s[i][j]);
print_optimal_parens(s[i][j]+1, j);
printf(")");
}
}
int main()
{
int n = 6;
p = 8;
p = 10;
p = 3;
p = 20;
p = 4;
p = 5;
p = 3;
matrix_chain_order(n);
print_optimal_parens(1, n);
return 0;
}
```
输出结果为:((1((23)(45)))6)
其中,m[i][j]表示第i个矩阵到第j个矩阵的最小计算次数,s[i][j]表示第i个矩阵到第j个矩阵的最优分割点。在程序中,我们用p[]数组存储每个矩阵的行数和列数,n表示矩阵的个数,即p数组的长度减1。
阅读全文