问题描述:
给定n个矩阵{A1,A2,…,An},其中 Ai 与 Ai+1 是可乘的,即相邻的两个矩阵,前面矩阵的列=后面矩阵的行。求计算矩阵连乘积的计算次序,使得计算该矩阵连乘积需要的数乘次数最少。
最优子结构性质:
计算A[i:j]的最优次序所包含的计算矩阵子链A[i:k]和A[k+1:j]的次序也是最优的,即最优解包含着其子问题的最优解,具有最优子结构性质,所以可用动态规划求解。
代码实现如下:
import numpy as np
def matrix_dimensions(n, d):
m = np.zeros([n + 1, n + 1], dtype=int)
sel = np.zeros([n + 1, n + 1], dtype=int)
for i in range(n - 1): # 遍历趟数
for j in range(1, n + 1):#要填的表格的行
min_value = 9999999
sel_temp = 0
if j + i + 1 > 6:
break
for k in range(j, j + i + 1):#要填的表格的列
if min_value > (m[j][k] + m[k + 1][j + i + 1] + d[j - 1] * d[k] * d[j + i + 1]):
sel_temp = k
min_value = m[j][k] + m[k + 1][j + i + 1] + d[j - 1] * d[k] * d[j + i + 1]
m[j][j + i + 1] = min_value
sel[j][j + i + 1] = sel_temp
return m[1:, 1:], sel[1:, 1:]
if __name__ == '__main__':
n = 6
dimensions = [30, 35, 15, 5, 10, 20, 25]
m, sel = matrix_dimensions(n, dimensions)
print(m, '\n', sel)