算法导论,动态规划 —— 矩阵链乘法(python代码实现示例)

# coding=utf-8
# 算法导论课本        动态规划  矩阵链乘法
#  矩阵链乘法的最优加括号方案    根据伪码 使用 python实现
# 辅助表 m 保存代价 m[i,j]
# 辅助表 s 记录最优值 m[i,j]对应的分割点 k
def maxChain(p):
    # n = len(p) - 1
    n = len(p)
    m = [[0 for i in range(n)] for j in range(n)]
    s = [[0 for i in range(n)] for j in range(n)]
    # for i in range(n):
    #     m[i][i] = 0
    for l in range(2,n):
        for i in range(1,n-l+1):
            j = i+l-1;
            m[i][j] = 9999999999;
            for k in range(i,j):
                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
    return m, s


# 输出矩阵链的最优括号化方法
def printOpt(s, i, j):
    if i == j:
        print("A", i, end='')
    else:
        # print("(", end="")
        print("(", end='')
        printOpt(s, i, s[i][j])
        printOpt(s, s[i][j]+1, j)
        print(")", end='')
print("start=========")
p = [30, 35, 15, 5, 10, 20, 25]
m, s = maxChain(p)

print(m)
print(s)
print("最优括号化方案为:")
printOpt(s, 1, 6)
print("")
print("其标量乘法次数为:", m[1][6])

print("Over=========")

转载于:https://my.oschina.net/xiaohuoer1995/blog/1600188

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值