這兩天演算法課剛學了這個,於是就想著用c語言自己擼出來。
首先是尋找最優解的過程,對於下標從i到j的矩陣鏈,我們將其分成兩部分i到k和k+1到j,遍歷i到j之間的每乙個k,找到最小值即可。
為了輸出最優解還需要乙個二維陣列儲存矩陣鏈i~j的截斷位置。
這裡是c**:
#include
#include
#define maxsize 1000
#define maxnum 100000000
int dp[maxsize]
[maxsize]
;//從i到j相乘所需要的最少計算次數
int memeo[maxsize]
[maxsize]
;//儲存從i到j在**截斷
void
find
(int
*numsequence,
int n)
for(l=
2;l<=n;l++)}
}}}void
print
(int start,
int end)
else
}int
main()
find
(numsequence,n)
;printf
("%d\n"
,dp[1]
[n])
;print(1
,n);
return0;
}
最優解不止乙個,而**所輸出的最優解是從左往右找到的第乙個,通過修改**,可以輸出所有最優解。 演算法導論 矩陣鏈乘法
問題描述 給定有n個連乘矩陣的維數,要求計算其採用最優計算次序時所用的乘法次數,即所要求計算的乘法次數最少。例如,給定三個連乘矩陣的維數分別是10 100,100 5和5 50,採用 a1a2 a3,乘法次數為10 100 5 10 5 50 7500次,而採用a1 a2a3 乘法次數為100 5 ...
演算法提高 矩陣乘法 最優矩陣鏈乘
題目鏈結 有n個矩陣,大小分別為a0 a1,a1 a2,a2 a3,a n 1 a n 現要將它們依次相乘,只能使用結合率,求最少需要多少次運算。兩個大小分別為p q和q r的矩陣相乘時的運算次數計為p q r。狀態轉移方程 普通遞推 按照j i遞增的順序遞推,時間複雜度o n 3 include ...
演算法導論之矩陣鏈乘法詳解
內容都是是演算法導論上的,僅作為乙個閱讀筆記,記錄一下自己閱讀過程中碰到的一些問題。希望能對需要的同學有所幫助!矩陣鏈乘法是指給定乙個n個矩陣的序列 矩陣鏈 a1,a2,an 我們希望計算它們的乘積 a1a2a3 an 對於這個問題,我們可以先用括號明確計算的次序,然後利用標準的矩陣相乘演算法進行計...