never say die !題目描述:
給定n個矩陣{a1,a2,…,an},其中ai與ai+1是可乘的,i=1,2 ,…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。例如:
a1=a2=
a3=a4=
a5=a6=
最後的結果為:((a1(a2a3))((a4a5)a6)) 最小的乘次為15125。
解題思路:
能用動態規劃的乙個性質就是最優子結構性質。
也就是說計算a[i:j]的最優次序所包含的計算矩陣子璉a[i:k]和a[k+1:j]的次序也是最優的。
動態規劃演算法解此問題,可依據其遞迴式以自底向上的方式進行計算(即先從最小的開始計算)。
在計算過程中,儲存已解決的子問題答案。每個子問題只計算一次,而在後面需要時只要簡單查一下,從而避免大量的重複計算,最終得到多項式時間的演算法。
我們可以根據下面這個公式來計算結果。其中p[i-1]表示的是第i個矩陣的行數,p[k]表示i:k矩陣合起來後最後得到的列數,p[j]是k+1:j合起來後得到的列數。這個部分的計算方法其實就是計算兩個矩陣相乘時總共的乘次數。
公式:
從連乘矩陣個數為2開始計算每次的最小乘次數m[i][j]:
m[0][1] m[1][2] m[2][3] m[3][4] m[4][5] //m[0][1]表示第乙個矩陣與第二個矩陣的最小乘次數
然後再計算再依次計算連乘矩陣個數為3:
m[0][2] m[1][3] m[2][4] m[3][5]
連乘矩陣個數為4:
m[0][3] m[1][4] m[2][5]
連乘矩陣個數為5:
m[0][4] m[1][5]
連乘矩陣個數為6:
m[0][5] //即最後我們要的結果
** 動態規劃演算法
一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...
動態規劃演算法
動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...
動態規劃演算法
動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...