矩陣鏈乘法 DP

2021-08-27 14:14:58 字數 914 閱讀 3293

矩陣鏈乘法是這樣的問題:

給定n個矩陣:a1,a2,…,an,其中ai與ai+1是可乘的,i=1,2…,n-1。確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。輸入資料為矩陣個數和每個矩陣規模,輸出結果為計算矩陣連乘積的計算次序和最少數乘次數。

我們稱有如下性質的矩陣乘積鏈為完全括號化的(fully parenthesized):它是單一矩陣,或者是兩個完全括號化的矩陣乘積鏈的積,且已外加括號。

矩陣乘法是滿足結合性的,因此它有許多種計算順序,我們的目標就是確定計算代價最小的計算順序。

矩陣鏈乘法問題和合併石子問題非常相似,所不同的是,合併石子計算的是合併時消耗的體力和,而矩陣鏈乘法計算的是乘法的次數,因此要進行模型轉換時,處理好他們的這點不同就好了。

我的方法是:對於n個矩陣相乘的問題,記錄每個矩陣的行數和列數,記錄到乙個pair陣列中,後續進行區間dp的時候,維護乙個區間的pair, 也就是該區間進行矩陣乘法之後生成的矩陣的行數和列數。它的意義在於將乙個計算好的區間作為乙個矩陣。

#include 

#include

using

namespace

std;

int main()

for (int i = 1; i <= n; ++i)

for (int k = 2; k <= n; ++k) }}

}cout

<< dp[1][n];}/*

21 2 3

33 4 2 6

630 35 15 5 10 20 25 // 15125

*/

dp矩陣鏈乘法

dp矩陣鏈乘法 矩陣a和b可乘的條件是矩陣a的列數等於矩陣b的行數。給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。輸入描述 首先輸入乙個n,表示幾個矩陣。換行輸入矩陣。輸出描述先輸出矩陣...

區間dp 石子合併 矩陣鏈乘法

有n堆石子圍成乙個圈,每一堆石子可以和相鄰的一堆合併得到新的一堆,所得的分數是新的一堆的數量。所有的石子合併成一堆後,最大的分數,最小的分數是多少。這是乙個環,需要拆分成鏈,把這n堆,複製一遍,變成2n堆。dp的時候還是得保證長度為n。dp min i j 表示合併i j這個區間所得到的最小的分數。...

矩陣鏈乘法

設m i j 為計算矩陣ai.j所需標量乘法運算次數的最小值。對整個問題計算ai.n的最小代價就是m i,n 使用輔助表是s 1.n,1.n 來記錄計算m i,j 時取得最優代價處k的值。k是裂開的位置。include define n 6 void matrix int p,int m n 1 i...