实验题目3:矩阵链乘法 (11.1日实验) 要求:
(1)设计暴力法,产生所有矩阵链相乘以组合情况,写出代码,并调试成功;
(2)设计动态规划算法,写出代码,寻找最小乘法次数和对应相乘的顺序,并调试成功;(3)随机产生由10个矩阵,测试(2)的代码,输出最小乘法次数和相乘的顺序。
from random import *
def matchain(c,n,path,r):
for d in range(1,n): #填充对角线
for i in range(1,n-d+1):
j=i+d
c[i][j]=2147483647 #无穷大
for k in range(i+1,j+1): #k开始分割
if c[i][j]> (c[i][k-1]+c[k][j]+r[i]*r[k]*r[j+1]):
path[i][j]=k
c[i][j] = min(c[i][j], c[i][k - 1] + c[k][j] + r[i] * r[k] * r[j + 1]) # i的行*k的行*j的列数
return c[1][n]
def findpath(c,path,i,j):
if i==j : #只有一个矩阵
print(i,end='')
else:
k=path[i][j] #分割点
print('(',end='')
findpath(c,path,i,k-1)#左边
findpath(c,path,k,j)#右边
print(')', end='')
if __name__=='__main__':
r=[randint(1,10) for i in range(11)]
r.insert(0,-1)
print(r)
path = [[0 for i in range(11)] for j in range(11)]
c=[[0 for i in range(11)] for j in range(11)]
count=matchain(c,10,path,r)
print(count)
# print(path)
findpath(c,path,1,10)
运行结果为:
[-1, 10, 2, 5, 4, 3, 2, 9, 3, 9, 2, 6]
348
(1(((((23)4)5)((67)(89)))10))