題目難度:★★
對於矩陣鏈乘法這道題目,我們先明確乙個概念:
對於n各需要相乘的矩陣所構成的(鏈),要計算其乘積a1a2...an。
我們需要對其加上n-1個括號,來確定其運算順序。
例:
明白括號概念之後,我們還需明白何為矩陣相乘。
矩陣相乘或不如稱為縱橫相乘,意思就是對於p*q,以及q*r的兩個矩陣,對於第乙個矩陣的p行,對應乘以第二個矩陣的r列,所得到的乙個p*r的矩陣,就是矩陣相乘的結果。
例:
而後,我們還需明白乙個最重要的概念:對於矩陣鏈乘法一題,其核心思想是要確定乙個具有最小代價的矩陣相乘順序,而並非要像矩陣相乘一樣,把n個矩陣一一相承。
例:
所以,因此我們可以確定,問題最終要求的是乙個最優解,那麼我們來看此問題是否具有最優子結構,也就是問題的乙個最優解是相當於其子問題的最優解。
對於矩陣列乘法這個問題:我們用m(i,j)表示對矩陣ai,ai+1..aj的相乘的最優解。如果這個問題在i<>j的時候,可以對ai,ai+1..aj在成ak與ak+1之間拆分。(i<=k
亦即,對於某個存在的k值,首先計算ai..k和ak+1..j的最優值,然後把他們相乘之後再得到的乙個值加上,就是m(i,j)裡面的乙個決策。所以,我們可以知道,當ai..k和ak+1..j相乘得到的最終結果值得時候,雖然不一定對於ai..j是最優解,但是必然是其中的某乙個解,如果對於這個解不是最優,則當k等於其餘任何(i,j)之內的值得時候,必然會得到乙個ai..j問題的最優解。
當得知問題具有最優子結構的時候,我們還可以推斷出此問題具有無後效性的原則,y因為其無論如何改變括號,a1..n的順序這n個數始終沒變,也就是說對於ai..j,j-i+1個矩陣相乘得到的結果,不管最終這個結果的答案是多少,都不會對a鏈裡其餘矩陣產生任何影響。
我們需要解決的最後乙個問題就是如何劃分狀態了。也就是定義遞迴解。在確定最優解時候用的m[i,j]計算矩陣最優解,其實就是乙個狀態。經過上面的推導,也很容易想到狀態轉移方程為:
這裡ai是由pi-1*pi得來的,所以加上pi-1pkpj的值,也就是當把ai..k和ak+1..j的矩陣合併之後得到的結果。這裡就是矩陣相乘的結果。
偽**如下:
根據偽**中儲存的s的值,我們還可以通過遞迴輸出,來輸出最後加括號的結果。
偽**如下:
當然,我們還可以用記憶化的方法,來求出最終的答案:
矩陣鏈乘法
設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...
矩陣鏈乘法
a1,a2.an,n個矩陣,矩陣ai的維數為p i 1 p i 資料矩陣鏈乘法加全部括號,使得計算乘法的次數最少 對矩陣ai,ai 1,其維數分別為p i 1 p i p i p i 1 ai ai 1要執行乘法運算的次數為p i 1 p i p i 1 m i j 為矩陣ai ai 1 aj最少的...
矩陣鏈乘法
輸入 ai是矩陣 輸出 計算a1 a2 an的最小代價方法 優化解的代價方程 for l 2 to n do 計算地l對角線 for i 1 to n l 1 do j i l 1 m i,j for k i to j 1 do 計算m i,j q m i,k m k 1,j pi 1pkpj if...