5行代码实现矩阵连乘方案选择
# rd: the round of execution 5个矩阵只需要四个轮次的循环
# 测试用例 3*5 5*10 10*8 8*2 2*4
for rd in range(1, len(p) - 1):
for i in range(1, len(p)-1):
j = i + rd
if j <= len(p)-1:
table[i][j] = min(table[i][m] + table[m+1][j] + p[i-1]*p[m]*p[j] for m in range(i, j))
table[i][j]
代表的是子问题的解,例如:
table[1][2]
这就是第一个矩阵和第二个矩相乘需要的乘法次数,这个数值是惟一的table[1][3]
这是第一个和第三个矩阵相乘需要的乘法次数,这时就有了多种选择,可以(12)3,也可以1(23),我们肯定首选较小的- 一直重复上一步就能达成目标
- 重复的轮次数值+1 就代表这次规划的是几个矩阵之间相乘
原理网上有很多了,这个还不错
import pandas as pd
# 25行替代了这个函数
def mymin(tb, i, j):
mi = 999999
for m in range(i, j):
if (table[i][m] + table[m+1][j] + p[i-1]*p[m]*p[j]) < mi:
mi = table[i][m] + table[m+1][j] + p[i-1]*p[m]*p[j]
return mi
if __name__ == '__main__':
p = [3, 5, 10, 8, 2, 4]
table = [[0 for _ in range(6)] for _ in range(6)]
# rd: the round of execution
for rd in range(1, len(p) - 1):
for i in range(1, len(p)-1):
j = i + rd
if j <= len(p)-1:
table[i][j] = min(table[i][m] + table[m+1][j] + p[i-1]*p[m]*p[j] for m in range(i, j))
df = pd.DataFrame(table)
print(df)