矩陣連乘DP

2021-08-01 05:54:51 字數 1211 閱讀 4010

矩陣相乘的條件 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

按此順序計算需要的次數((a1*a2)*a3):10x100x5+10x5x50=7500次

按此順序計算需要的次數(a1*(a2*a3)):10x5x50+10x100x50=52500次(不明白他們為什麼都寫75000,應該是錯了)}

###############

我們可以對那麼一組an新增括號,使其運算次數最少,用到動態規劃

從a1a2,a2a3,a3a4,an-1an算起

近一步算a1*a2*a3,a2*a3*a4,an-2*an-1*an以此類推 這樣就成為了乙個同態規劃的問題

儲存陣列第n矩陣行數m[n-1] 列數m[n]  ;n+1矩陣行數m[n] 列數m[n+1].

狀態轉換公式:

k為間斷位置 a1*a2*a3*a4  當k=3 ,i=1,j=4  也就是 (a1*a2)' * (a3*a4)『  

m[i-1]是前半式行數   m[k]是前半式列後半式列數   m[j]是後半式列數 即位文章第一行的x*y*z   另外兩個d就是通過兩式內部規劃後dp值

################最終dp結束後的 d[1][n-1]就是結果最優運算次數  :)

c++**

#include#include#includeusing namespace std;

#define inf 99999

#define size 100

int d[size][size]; //d[i][j]最優運算次數

int a[size] ; // i矩陣行為a[size-1] 列a[size] 後乙個矩陣列和前乙個矩陣行是相等的

void dp_matrix(int n) //n+1個資料(0-n) n個矩陣

dp_matrix(n);

cout<

DP 矩陣連乘

問題 給定n個矩陣,求乘法次數的最小值 1 最優子結構 乙個簡單的解決辦法是把括號放在所有可能的地方,計算每個位置的成本,並返回最小值。對於乙個長度為n的鏈,我們有n 1種方法放置第一組括號。例如,如果給定的鏈是4個矩陣。讓矩陣連為abcd,則有3種方式放第一組括號 a bcd ab cd和 abc...

矩陣連乘問題(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基礎 矩陣連乘

dp基礎 矩陣連乘 description 矩陣乘法是線性代數中最基礎的乙個知識點,設矩陣a為乙個n行m列的矩陣,矩陣b為x行y列,那麼a能乘b的條件為m x,它們相乘將得出乙個n行y列的矩陣,進行一次矩陣乘法的運算次數為n m y,現在給出k個矩陣,你每次可以合併相鄰的兩個矩陣,將它們做乘法得出的...