>>算法导论P201
>>用Python实现算法真是太爽了
def MATRIX_CHAIN_ORDER(p):
n=len(p)-1#n is 矩阵个数
m=[[0 for col in range(n+1)]for row in range(n+1)]#m[i][j] is 对应矩阵计算 最优值
s=[[0 for col in range(n+1)]for row in range(n+1)]#分割点记录
for i in range(1,n+1):
m[i][i]=0#单个矩阵计算量为0
for L in range(2,n+1):#L为矩阵链长度,依次枚举
for i in range(1,n-L+2):#n-L+1为最后一次枚举的矩阵链的起点
j=i+L-1#j为枚举的矩阵链的终点
m[i][j]=float('inf')#超出枚举的矩阵链计算量设为无穷大
for k in range(i,j):#k is 分割点,枚举
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#分割点记录
PRINT_OPTIMAL_PARENS(s,1,n)
return 0
def PRINT_OPTIMAL_PARENS(s,i,j):
if i==j:
print("A"+str(i),end='')
else:
print("(",end='')
PRINT_OPTIMAL_PARENS(s,i,s[i][j])
PRINT_OPTIMAL_PARENS(s,s[i][j]+1,j)
print(")",end='')
return 0
#test
p=[30,35,15,5,10,20,25]
MATRIX_CHAIN_ORDER(p)