问题背景:
由于矩阵乘法满足结合律,所以计算矩阵连乘的连乘积可以用许多不同的计算次序,这种计算次序可以用加括号的方式来确定。我们的目标只是确定运算顺序然后降低乘法的运算次数。
最优子结构:m[i,j]=0 当i=j; min{m[i,k]+m[k+1,j]+p[i-1]*p[k]*p[j]} 当i<j。(k就是切割点的位置)
即i和j矩阵之间,k处添加括号(最后相乘的地方),最后一步乘法代价=i的行*k的列*j的列
1.自顶向下的实现:
#p是矩阵的列数,p[0]是第一个矩阵的行,p[1]是第一个矩阵的列,p[2]是第二个矩阵的列。因为矩阵可以相乘必然相容
#memozed_list保存运算乘法的次数,s保存矩阵Ai→Aj中最后一次相乘的地方,n是相乘矩阵数量
def matrix_memoed(p):
n = len(p) - 1
memozed_list = []
s = []
for i in range(n + 1):
memozed_list.append([-1 for i in range(n + 1)])
s.append([0 for i in range(n + 1)])
matrix_help(memozed_list, p, s, 1, n)
for i in memozed_list[1:]:
print(i)
matrix_print(s,