基於DP的矩陣連乘問題

2021-07-29 21:52:23 字數 743 閱讀 6667

當多個連續可乘矩陣做乘法時,選擇正確的做乘順序可以有效減少做乘法的次數,而選擇的方法可以很容易的通過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#include 

intmatrix_p[max_v];

intm[max_v][max_v];

intmatrix_v;

int matrix_mul(int i, int

j) }

return

m[i][j];

}

主程式:

void

matrix_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...