矩陣連乘問題 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]}')
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2770184/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 動態規劃&矩陣連乘動態規劃矩陣
- 矩陣連乘(動態規劃演算法)矩陣動態規劃演算法
- 動態規劃_備忘錄法_矩陣鏈乘問題動態規劃矩陣
- 矩陣連乘問題矩陣
- 動態規劃6:臺階問題和矩陣最小路徑問題動態規劃矩陣
- 矩陣連乘矩陣
- hdu 1757 矩陣連乘矩陣
- 演算法題:矩陣鏈乘問題演算法矩陣
- 演算法題系列:矩陣鏈乘問題演算法矩陣
- 動態規劃之子序列問題動態規劃
- 揹包問題----動態規劃動態規劃
- 【動態規劃】揹包問題動態規劃
- 整數劃分問題(動態規劃)動態規劃
- 動態規劃-最大子矩陣和(ZOJ 1074 TO THE MAX )動態規劃矩陣
- 動態規劃求解矩陣累計和最大的路徑動態規劃矩陣
- 動態規劃使用一維陣列要注意的問題動態規劃陣列
- poj 2778 AC自動機與矩陣連乘矩陣
- hdu2243 ac自動機+矩陣連乘矩陣
- 動態規劃 01揹包問題動態規劃
- 找零問題與動態規劃動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- 動態規劃,股票問題留坑動態規劃
- 動態規劃篇——揹包問題動態規劃
- 醜數問題——動態規劃、Java動態規劃Java
- (動態規劃)最小分糖果問題動態規劃
- 動態規劃--01揹包問題動態規劃
- 動態規劃9:變態跳臺問題動態規劃
- 矩陣連乘演算法精講矩陣演算法
- 最大子陣——動態規劃DP動態規劃
- 【動態規劃】01揹包問題【續】動態規劃
- 動態規劃5:找零錢問題動態規劃
- 好題——動態規劃動態規劃
- 動態規劃專題動態規劃
- 動態規劃題單動態規劃
- 動態規劃之股票問題123動態規劃
- 0-1揹包問題(動態規劃)動態規劃
- 動態規劃,這幾個問題最常見!動態規劃