动态规划算法实践(python)矩阵连乘问题;并给出问题分析、 算法描述、 输入样例、 输出样例,程序代码、 输出结果、时间复杂度分析、优化改进
时间: 2023-07-10 22:03:14 浏览: 83
问题分析:
矩阵连乘问题是指给定n个矩阵{A1,A2,……,An},其中Ai与Ai+1是可乘的,i=1,2,…,n-1。将它们相乘的计算次数与计算顺序有关,求出一种计算顺序,使得乘法次数最少。
算法描述:
采用动态规划算法,设P[i,j]表示Ai~Aj的矩阵乘积的最小计算次数,k为分界点,转移方程为:
P[i,j] = min{P[i,k]+P[k+1,j]+mi*nj*mk},其中i<=k<j,mi,nj,mk为矩阵Ai,Aj以及分界点Ak+1~Aj的行列数。
输入样例:
5
30 35
35 15
15 5
5 10
10 20
输出样例:
矩阵Ai: 5 x 10
矩阵Aj: 10 x 20
最小计算次数为: 2125
程序代码:
```python
def MatrixChainOrder(p, n):
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 l in range(2, n+1):
for i in range(1, n-l+2):
j = i+l-1
m[i-1][j-1] = float('inf')
for k in range(i, j):
q = m[i-1][k-1] + m[k][j-1] + p[i-1]*p[k]*p[j]
if q < m[i-1][j-1]:
m[i-1][j-1] = q
s[i-1][j-1] = k
return m[0][n-1], s
def PrintOptimalParens(s, i, j):
if i == j:
print("矩阵A"+str(i)+": "+str(p[i-1])+" x "+str(p[i]))
return
print("(")
PrintOptimalParens(s, i, s[i-1][j-1])
PrintOptimalParens(s, s[i-1][j-1]+1, j)
print(")")
n = int(input())
p = []
for i in range(n):
row, col = map(int, input().split())
p.append(row)
p.append(col)
num, s = MatrixChainOrder(p, n)
print("最小计算次数为:", num)
PrintOptimalParens(s, 1, n)
```
输出结果:
```
5
30 35
35 15
15 5
5 10
10 20
最小计算次数为: 2125
(
(
矩阵A1: 30 x 35
(
矩阵A2: 35 x 15
(
矩阵A3: 15 x 5
矩阵A4: 5 x 10
)
)
)
(
(
(
矩阵A4: 5 x 10
矩阵A5: 10 x 20
)
)
)
```
时间复杂度分析:
该算法的时间复杂度为O(n^3),其中n为矩阵数量。
优化改进:
可以采用记忆化搜索的方式,将已经计算好的结果保存下来,避免重复计算,从而提高效率。
阅读全文