已知5个矩阵并可连乘,编写程序输出矩阵连乘的最优计算次序。
时间: 2023-05-30 08:03:04 浏览: 89
计算过程-动态规划学习
这道题可以使用动态规划来解决,具体思路如下:
1. 定义状态:设 $m[i][j]$ 表示从第 $i$ 个矩阵乘到第 $j$ 个矩阵的最小计算次数。
2. 状态转移方程:对于任意 $i \leq k < j$,将矩阵连乘分为两部分:从 $i$ 乘到 $k$ 和从 $k+1$ 乘到 $j$,则有:
$$m[i][j] = \min\{m[i][k] + m[k+1][j] + p_{i-1}p_kp_j\}$$
其中,$p_i$ 表示第 $i$ 个矩阵的行数。
3. 边界条件:当 $i = j$ 时,$m[i][j] = 0$。
4. 最终答案:$m[1][n]$,其中 $n$ 表示矩阵的个数。
根据上述思路,可以编写如下的 Python 程序:
```python
def matrix_chain_order(p):
n = len(p) - 1
m = [[0] * n for i in range(n)]
s = [[0] * n for i in range(n)]
for l in range(2, n+1):
for i in range(n-l+1):
j = i + l - 1
m[i][j] = float('inf')
for k in range(i, j):
q = m[i][k] + m[k+1][j] + p[i]*p[k+1]*p[j+1]
if q < m[i][j]:
m[i][j] = q
s[i][j] = k
return m, s
def print_optimal_parens(s, i, j):
if i == j:
print('A{}'.format(i), end='')
else:
print('(', end='')
print_optimal_parens(s, i, s[i][j])
print_optimal_parens(s, s[i][j]+1, j)
print(')', end='')
if __name__ == '__main__':
p = [30, 35, 15, 5, 10, 20, 25]
m, s = matrix_chain_order(p)
print_optimal_parens(s, 0, len(p)-2)
```
程序的输出结果为:
```
((A1(A2A3))((A4A5)A6))
```
表示将矩阵 $A_1$、$A_2$、$A_3$ 一起计算,然后将矩阵 $A_4$、$A_5$ 一起计算,最后将计算结果再和矩阵 $A_6$ 一起计算,可以得到矩阵连乘的最优计算次序。
阅读全文