動態規劃過程是:每次決策依賴於當前狀態,又隨機引起狀態的轉移。乙個決策序列就是在變化的狀態中產生,所以,這種多階段最優化決策解決問題的過程稱為動態規劃。
給定n個矩陣{a1,a2,…,an},其中ai與ai+1是可乘的,i=1,2…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。
演算法描述:
將矩陣連乘積簡記為a[i:j]
,這裡i
≤j
設這個計算次序在矩陣ak和
ak+1
之間將矩陣鏈斷開,i≤
k,則其相應完全加括號方式為
**實現:
#includeusing namespace std;
void matrixchain(int *p,int n,int **m,int **s){
for(int i = 1;i <= n;i++)
m[i][i] = 0;//初始化矩陣
// r 表示每次寬度
// i,j表示從從矩陣i到矩陣j
// k 表示切割位置
for(int r = 2;r <= n;r++)
for(int i = 1;i <= n-r+1li++){
int j = i+r-1;
// 從矩陣i到矩陣j連乘,從i的位置切割,前半部分為0
m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j];
s[i][j] = i;
for(int k = i+1;k < j;k++){
int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
if(t
執行結果
算例分析初始條件**m
(用於存放過程),陣列
p(所要計算的值),
**s(用於存放連乘次數)。演算法
matrixchain
的主要計算量取決於演算法中對r,
i和k的
3重迴圈。迴圈體內的計算量為
o(1),而3
重迴圈的總次數為
o(n3)
。因此演算法的計算時間上界為
o(n3)
。演算法所占用的空間顯然為
o(n2)
。學習該演算法心得
動態規劃法是求解最優化問題的一種方法,
動態規劃演算法與
分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從
這些子問題的解得到原問題的解。
矩陣連乘 動態規劃 動態規劃解矩陣連乘問題
一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...
動態規劃 矩陣連乘問題
給定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 ...
動態規劃 矩陣連乘問題
以下只是對此問題的乙個 實現,具體理論部分請參見王曉東 演算法設計與分析 第2 版3.1 節 矩陣連乘問題。include include using namespace std define max count 20 矩陣屬性 struct tagmatrixattribute 矩陣連乘加括號求解...