當多個連續可乘矩陣做乘法時,選擇正確的做乘順序可以有效減少做乘法的次數,而選擇的方法可以很容易的通過dp實現。
原理就是對於每乙個所求矩陣,搜尋所有可以相乘得到它的方法,比較它們的消耗,選取最小值作為採用的方法。
例如,給出矩陣a1(30*35) a2(35*15) a3(15*5) a4(5*10) a5(10*20) a6(20*25)
我們另m(i,j)表示從第i個矩陣乘到第j個矩陣,並用p[i]表示矩陣的邊長,如p[0]=30,p[1]=35......
於是我們有:
若i==j m(i,j)=0
若i實際操作過程中,我們往往用陣列來記錄每乙個我們已經計算過的m(i,j)來提高效率。
**如下:
主演算法:
#pragma once#includeintmatrix_p[max_v];
intm[max_v][max_v];
intmatrix_v;
int matrix_mul(int i, int
j) }
return
m[i][j];
}
主程式:
voidmatrix_chain_test()
m[i][i] = 0
; }
inti, j;
while (true
)
}
矩陣連乘問題(dp)
題目 計算矩陣連乘積a1,a2,an,其中ai的維度為p i 1 p i 輸入規模n,p 0 p n 輸出最少乘的次數和斷點處也就是乘法順序。思路 區間dp,m i j 表示從ai到aj區間內的最少乘的次數,列舉k i用s i j 記錄每次最少次數的時候是在哪個地方斷開,即k的位置。詳見 inclu...
DP 矩陣連乘
問題 給定n個矩陣,求乘法次數的最小值 1 最優子結構 乙個簡單的解決辦法是把括號放在所有可能的地方,計算每個位置的成本,並返回最小值。對於乙個長度為n的鏈,我們有n 1種方法放置第一組括號。例如,如果給定的鏈是4個矩陣。讓矩陣連為abcd,則有3種方式放第一組括號 a bcd ab cd和 abc...
矩陣連乘DP
矩陣相乘的條件 a1 a2 a1 x,y a2 y,z a3 x,z a1的列數數等於a2的行數 運算次數為x y z 對於a1,a2,an個矩陣,a1 a2 a3 a4 an 我們可以用結合律 也就是新增括號,使整個運算過程運算次數最少 演算法效率最高。維數分別為10 100 100 5 5 50...