mirror of
https://github.com/SunnyQjm/algorithm-review.git
synced 2026-06-03 08:16:43 +08:00
add:chapter6 10_matrix-multiplication
This commit is contained in:
@@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# coding=utf-8
|
||||||
|
|
||||||
|
#######################################################################################
|
||||||
|
# 矩阵相乘 => 详情见PPT
|
||||||
|
#
|
||||||
|
# 描述:设 A1, A2, … , An 为矩阵序列,Ai 为Pi-1xPi 阶矩阵,i = 1,2,…,n. 确定乘法顺序使得元素相乘的总次数最少.
|
||||||
|
# 输入:向量 P = <P0, P1, … , Pn>,n个矩阵的行数、列数
|
||||||
|
#
|
||||||
|
# 实例:P = <10, 100, 5, 50>
|
||||||
|
# A1: 10x100, A2: 100x5, A3: 5x50
|
||||||
|
# 括号位置不同,相乘总次数不同:
|
||||||
|
# (A1 A2)A3: 10x100x5 + 10x5x50 = 7500
|
||||||
|
# A1(A2 A3): 10x100x50 + 100x5x50 = 75000
|
||||||
|
#######################################################################################
|
||||||
|
|
||||||
|
class Solution:
|
||||||
|
def miniMultiplicationTimes(self, matrixs):
|
||||||
|
"""
|
||||||
|
:type matrixs: List[int]
|
||||||
|
:rtype int
|
||||||
|
|
||||||
|
(knowledge)
|
||||||
|
|
||||||
|
思路:
|
||||||
|
1. 使用动态规划;
|
||||||
|
2. dp[i][j] => 得到Ai..j 所需要的最少相乘次数
|
||||||
|
3. 状态转移方程:
|
||||||
|
m(i, j) = 0 i <= j <= i + 1
|
||||||
|
min(i < k < j){m(i, k) + m(k, j) + Pi*Pk*Pj} j > i + 1
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 初始化dp数组
|
||||||
|
dp = [[float("inf") for i in range(len(matrixs))] for i in range(len(matrixs))]
|
||||||
|
|
||||||
|
# 让满足 i <= j <= i + 1的置为0
|
||||||
|
for i in range(len(matrixs) - 1):
|
||||||
|
dp[i][i] = 0
|
||||||
|
dp[i][i + 1] = 0
|
||||||
|
dp[len(matrixs) - 1][len(matrixs) - 1] = 0
|
||||||
|
|
||||||
|
# 此处i表示每轮要求的目标值的间隔
|
||||||
|
# 比如i=2,表示求所有索引间隔为2得dp值,eg.: dp[0][2], dp[1][3], dp[2][4]...
|
||||||
|
for i in range(2, len(matrixs)):
|
||||||
|
for j in range(len(matrixs) - i):
|
||||||
|
for k in range(j + 1, j + i):
|
||||||
|
dp[j][j + i] = min(dp[j][j + i], dp[j][k] + dp[k][j + i] + matrixs[j] * matrixs[k] * matrixs[j + i])
|
||||||
|
return dp[0][len(matrixs) - 1]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
solution = Solution()
|
||||||
|
print(solution.miniMultiplicationTimes([30, 35, 15, 5, 10, 20]), "= 11875")
|
||||||
Reference in New Issue
Block a user