5行代码实现矩阵连乘方案选择

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值