矩阵连乘问题 Python 动态规划
1.1?構造最優值矩陣 ,并將斷開位置記錄在斷開位置矩陣中
def matrixChain():
?????"""
?????計算最優值關系矩陣
?????:return: None
?????"""
?????for i in range(2, n + 1): ?#?對角線
?????????for r in range(1, n - i + 2): ?#?行
?????????????c = r + i - 1 ?#?列
?????????????#?找到?m[r][c]?的最小值并計入列表
?????????????m[r][c] = m[r][r] + m[r + 1][c] + p[r - 1] * p[r] * p[c]
?????????????s[r][c] = r
?????????????#?從?r+1?道?c-1?尋找?m[r][c]?的最小值
?????????????for j in range(r + 1, c):
?????????????????t = m[r][j] + m[j + 1][c] + p[r - 1] * p[j] * p[c]
?????????????????if t < m[r][c]:
?????????????????????m[r][c] = t
?????????????????????#?將子序列?r-c?段中?j?的位置存入?s?,此處斷開可以得到最優解
?????????????????????s[r][c] = j
1.2?根據斷開位置矩陣計算得出最優解
def traceBack(r: int, c: int) -> None:
?????"""
?????根據?s?記錄的各個子段的最優解,將其輸出
?????:param r:?行
?????:param c:?列
?????:return: None
?????"""
?????if r == c:
?????????return
?????traceBack(r, s[r][c])
?????traceBack(s[r][c] + 1, c)
?????#?描述括號位置
?????print(f'?左括號?: A{s[r][c]}?之前?\t?與之對應的右括號?: A{c}?之后?')
2.?算法實現?-?完整代碼
print('?請輸入連乘矩陣的維數:?')
print('?示例:?A[2*5],B[5*10],C[10*2]')
print('?應輸入:?2 5 10 2(?使用空格隔開?)')
p = list(map(int, input().split())) ?#外匯跟單gendan5.com??獲取用戶輸入連乘矩陣維數
n = len(p) - 1 ?#?計算用戶輸入矩陣個數
m = [[0 for i in range(n + 1)] for j in range(n + 1)] ?#?初始化最優解列表
s = [[0 for i in range(n + 1)] for j in range(n + 1)] ?#?初始化斷開位置列表
def matrixChain():
?????"""
?????計算最優值關系矩陣
?????:return: None
?????"""
?????for i in range(2, n + 1): ?#?對角線
?????????for r in range(1, n - i + 2): ?#?行
?????????????c = r + i - 1 ?#?列
?????????????#?找到?m[r][c]?的最小值并計入列表
?????????????m[r][c] = m[r][r] + m[r + 1][c] + p[r - 1] * p[r] * p[c]
?????????????s[r][c] = r
?????????????#?從?r+1?道?c-1?尋找?m[r][c]?的最小值
?????????????for j in range(r + 1, c):
?????????????????t = m[r][j] + m[j + 1][c] + p[r - 1] * p[j] * p[c]
?????????????????if t < m[r][c]:
?????????????????????m[r][c] = t
?????????????????????#?將子序列?r-c?段中?j?的位置存入?s?,此處斷開可以得到最優解
?????????????????????s[r][c] = j
def traceBack(r: int, c: int) -> None:
?????"""
?????根據?s?記錄的各個子段的最優解,將其輸出
?????:param r:?行
?????:param c:?列
?????:return: None
?????"""
?????if r == c:
?????????return
?????traceBack(r, s[r][c])
?????traceBack(s[r][c] + 1, c)
?????#?描述括號位置
?????print(f'?左括號?: A{s[r][c]}?之前?\t?與之對應的右括號?: A{c}?之后?')
matrixChain()
traceBack(1, n)
print(f'?乘法次數?: {m[1][n]}')
總結
以上是生活随笔為你收集整理的矩阵连乘问题 Python 动态规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个简易的渲染循环结构
- 下一篇: python实现基于八方向判断的断裂连接