動態規劃 矩陣鏈連乘問題

2021-06-19 05:10:28 字數 2686 閱讀 5266

矩陣鏈連乘問題:由於不同的矩陣相乘順序會導致不同的矩陣標量元素相乘的運算元,求設矩陣佇列a1a2a3...an-1an的最小相乘運算元。

好吧,先讓我們回顧一下線性代數中矩陣乘法的相關知識(其實看到這個題目時我已經忘了兩個矩陣是怎麼相乘的了,剛好回顧一下),兩個矩陣只有相容才能相乘。即a x b要求a的列數等於b的行數。如[n * m]和[m * p]的兩個矩陣是可以相乘的,且它們相乘的標量運算數為n * m * p。那麼不同的相乘順序又為什麼會有不同的運算元呢?可以這樣舉例證明:現有三個矩陣a1,a2,a3對應的規模分別是,,。

a.若採用(a1(a2a3))的相乘順序,先進行a2a3相乘,相乘次數為100 x 20 x 50 = 100000,得到乙個的矩陣;再將結果和a1相乘,又需要 5 x100 x 50 = 25000;總共需要乘運算元為:25000+100000 = 125000

b.若採用((a1a2)a3)的相乘順序,先進行a1a2相乘,相乘次數為5 x 100 x 20 = 10000,得到乙個的矩陣,再將結果和a3相乘,有需要5 x 20 x 50 = 5000;總共需要乘運算元為:10000+5000 = 15000

由此可見不同的相乘順序需要不同的相乘次數。也可以這麼理解,矩陣和矩陣 會得到乙個的矩陣,由此可見相乘後的矩陣規模有p決定。

狀態轉移方程如下(其中m[i][j]表示從ai到aj的最優解)

**如下:

package com.wly.algorithmbase.dailyproblem;

/** * 動態規劃解最小矩陣連乘運算元問題

* @author wly

* */

public class minmatrixchainoperation 對應矩陣a1,a2,a3

// int testmatrice = ;

int testmatrice = ;

system.out.println(slove(testmatrice)); }

/*** 求解問題,由於使用陣列做結果容器,所以當要表示子鏈aiai+1...aj在陣列中的實際表現為result[i-1][j-1]

* 下面的**的變數都盡量用其對應的功能命名,但是**會顯得很繞,不過這樣便於理解。在這之後又寫了乙個簡化了變數的方法,以便於閱讀

* 每個矩陣鏈a1a2a3...an-1an都可以分割成a1a2a3...ak和ak+1ak+2...an兩個子舉證連,即

* f(a1a2a3...an-1an) = f(a1a2a3...ak) + f(ak+1ak+2..an) + a1akan

* @param 矩陣鏈的行,列數陣列

* @return 最小乘運算元

*/public static int slove(int p) }}

}printseparate(separate,0,separate[0].length-1);

return result[1-1][matrixnum-1]; }

/*** 上面方法的簡化版,主要簡化了變數名

* 之所以這樣是因為陣列索引是基於0的,而狀態轉移中的r[i][j]表示從i到j的子鏈的最優解,實際在陣列中進行-1糾偏動作

* @param p

* @return

*/public static int slovesimplify(int p) }}

}printseparate(s,0,s[0].length-1);

return r[1-1][n-1]; }

/*** 列印最優解分割方式

* @param separate

* @param start

* @param end

*/private static void printseparate(int separate,int start,int end) else

}}

執行結果:

1

54

其中第一行的表示只有分割點的位置在a1和a2之間,即為((a1)(a2a3)),可以口算驗證一下:

(a1(a2a3))中,先計算a2a3 = 3*4*2 = 24.得到3*2的矩陣,再和a1乘,又要5*3*2=30,總共30+24=54,另外一種可能((a1a2)a3)中,先計算a1aa2=5*3*4=60,得到5*4的矩陣,再和a3,又要5*4*2=40,總共60+40=100。所以驗證通過

最後總結一下本人對動態規劃思想的理解:

1、動態規劃並不能使需要遍歷的可能解變得更少(這個我剛開始看的時候還以為可以呢),只是在求解過程中,人為的安排子問題的求解順序,使規模較小的子問題首先被求解,並將其解儲存起來,那麼在求解更高層次的子問題時,就可以直接利用儲存起來的子問題的解了,而不需要再次重新求解其子問題的解了。這是一種以空間代價換取時間的做法,當然這些話,每本演算法書上都有,不過要做到真的體會理解,還是需要自己動手寫**的。

2、關於最優子問題結構的論證,可以採用反證法,如:矩陣鏈a1a2a3a4...an的最優解的是a1a2a3...ak和ak+1ak+2...an,則如果存在另外一種更有的分割點m使得a1a2a3...am和am+1am+2an這種分割方式的解更優,則k分割點就不是當前問題的最優解了,矛盾。

3、關於重疊子問題特性,指的是同乙個子問題,只是作為不同的問題的子問題出現而已。與分治法不同的是,動態規範中不同規模的子問題可能共有了某個子子問題的解。

至此動態規劃的學習暫時告以段落,以後會做些習題鞏固理解。

o啦~~~

謝謝!!

矩陣連乘 動態規劃 動態規劃解矩陣連乘問題

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...

python矩陣連乘 動態規劃 矩陣連乘問題

一 問題描述 給定n個數字矩陣a1,a2,an,其中ai與ai 1是可乘的,設ai是pi 1 pi矩陣,i 1,2,n。求矩陣連乘a1a2.an的加括號方法,使得所用的乘次數最少。例子三個矩陣連乘,可以有 a1a2 a3和a1 a2a3 兩種方法求積 乘法次數分別為 p0p1p2 p0p2p3和p0...

動態規劃 矩陣連乘問題

給定n 1個矩陣 a0,a1,a2,an 1 其中ai與ai 1是可乘的,i 0,1,2,n 2。矩陣乘法滿足結合律。考察這n個矩陣的連乘積,得出運算次數最少的結合。首先,考慮兩個矩陣相乘。如果a b兩個矩陣可以相乘,那麼a b的形式必定滿足 a p q b q r 設c a b,那麼c滿足c p ...