输入:矩阵链Ai…j的输入为向量P=<Pi-1,Pi,…,Pj>,其中:1<=i<=j<=n. 输出:矩阵链Ai…j乘法的最佳运算次序。 要求采用迭代方法进行程序设计,并设计备忘录和标记函数表。
时间: 2023-06-20 21:09:11 浏览: 248
这是一个经典的动态规划问题,可以采用迭代的方式求解。算法的思路是,先计算长度为1的矩阵链,再计算长度为2的矩阵链,以此类推,最终得到长度为n的矩阵链的最优解。
具体实现步骤如下:
1. 初始化备忘录M和标记函数S,其中M[i][j]表示从Pi到Pj的矩阵链的最优解(即最小乘法次数),S[i][j]表示从Pi到Pj的矩阵链的最优解对应的断点k。
2. 外层循环枚举矩阵链的长度l,从2开始到n。内层循环枚举矩阵链的起点i,计算对应的终点j=i+l-1。
3. 对于每个长度为l的矩阵链,枚举断点k=i到j-1,计算M[i][j]的值,并记录下对应的S[i][j]。
4. M[i][j]的计算公式为:M[i][j]=min{M[i][k]+M[k+1][j]+Pi-1*Pk*Pj},其中k的范围是i<=k<j。
5. 最终得到M[1][n]即为整个矩阵链的最优解,S[1][n]记录了最优解对应的断点。
以下是Python代码实现:
```python
def matrix_chain_order(p):
n = len(p) - 1
m = [[0] * (n + 1) for _ in range(n + 1)]
s = [[0] * (n + 1) for _ in range(n + 1)]
for l in range(2, n + 1):
for i in range(1, n - l + 2):
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-1]*p[k]*p[j]
if q < m[i][j]:
m[i][j] = q
s[i][j] = k
return m[1][n], s
# 示例
p = [30, 35, 15, 5, 10, 20, 25]
min_times, s = matrix_chain_order(p)
print(min_times) # 输出15125
print(s) # 输出[[0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 3, 3, 3], [0, 0, 0, 2, 3, 3, 3], [0, 0, 0, 0, 3, 3, 3], [0, 0, 0, 0, 0, 4, 5], [0, 0, 0, 0, 0, 0, 5], [0, 0, 0, 0, 0, 0, 0]]
```
阅读全文