算法实验报告2——矩阵连乘问题——2020.12.17

一丶矩阵连乘问题

A1 A2 A3 A4 A5 A6
3035 3515 155 510 1020 2025
求最小数乘次数。

二丶矩阵连乘代码

# coding=gbk
__author__ = 'Blockchain_Key'
__time__ = '2020.12.17'

# row_num 行数
# col_num 列数
class Matrix:
    def __init__(self, row_num=0, col_num=0, matrix=None):
        if matrix != None:
            self.row_num = len(matrix)
            self.col_num = len(matrix[0])
        else:
            self.row_num = row_num
            self.col_num = col_num
        self.matrix = matrix


def matrix_chain(matrixs):
    matrix_num = len(matrixs)     # 求取矩阵个数
    count = [[0 for j in range(matrix_num)] for i in range(matrix_num)]   # 建立二维动态规划表
    flag = [[0 for j in range(matrix_num)] for i in range(matrix_num)]  # 建立二维标识矩阵
    for interval in range(1, matrix_num + 1):   # 从1开始,方便计算
        for i in range(matrix_num - interval):  # 剩余的矩阵
            j = i + interval
            count[i][j] = count[i][i] + count[i + 1][j] + matrixs[i].row_num * matrixs[i + 1].row_num * matrixs[j].col_num
            flag[i][j] = i
            for k in range(i + 1, j):
                temp = count[i][k] + count[k + 1][j] + matrixs[i].row_num * matrixs[k + 1].row_num * matrixs[j].col_num
                if temp < count[i][j]:
                    count[i][j] = temp
                    flag[i][j] = k
    traceback(0, matrix_num - 1, flag)
    return count[0][matrix_num - 1]  # 最终结果


def traceback(i, j, flag):
    if i == j:
        return
    # 递归处理
    traceback(i, flag[i][j], flag)
    traceback(flag[i][j] + 1, j, flag)


if __name__=="__main__":
    matrixs = [Matrix(30, 35), Matrix(35, 15), Matrix(15, 5), Matrix(5, 10), Matrix(10, 20), Matrix(20, 25)]
    result = matrix_chain(matrixs)
    print(result)

三丶运行结果

在这里插入图片描述

——虎鼓瑟兮鸾回车,仙之人兮列如麻——
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blockchain_KT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值