矩阵连乘问题(c++)
矩陣連乘問題
問題描述:
給定n個矩陣:A1,A2,…,An,其中Ai與Ai+1是可乘的,i=1,2…,n-1。確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。輸入數據為矩陣個數和每個矩陣規模,輸出結果為計算矩陣連乘積的計算次序和最少數乘次數。
問題分析:
1.分析最優解的結構
設計求解具體問題的動態規劃算法的第一步是刻畫該問題的最優解的結構特征。我們將矩陣連乘積AiAi+1…Aj簡記為A[ i : j ]。考察計算A[ 1: n]的最優計算次序。設這個計算次序在矩陣Ak和Ak+1之間將矩陣鏈斷開,1<=k<n,則其相應的完全加括號形式為((A1…Ak)(Ak+1…An))。以此次序,總的計算量為A[ 1 : k ]的計算量加上A[ k+1 : n ]的計算量, 再加上A[ 1 : k ]和A[ k+1 : n ]相稱的計算量。
這個問題的關鍵特征是:計算A[ 1 :n ]的最優次序所包含的計算矩陣子鏈a[ 1 : k ]和A[ k+1 : n ]的次序也是最優的。因此,矩陣連乘積計算次序問題的最優解包含著其子問題的最優解。這種性質稱為最優子結構性質。問題的最優子結構性質是該問題可以用動態規劃算法求解的顯著特征。
2.建立遞歸關系
從連乘矩陣個數為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] //即最后我們要的結果
若將對應于m[i][j]的斷開位置k記為s[i][j],在計算最優值m[i][j]后,可以遞歸地有s[i][j]構造出相應的最優解。
計算最優值
根據計算m[ i ][ j ]的遞歸式,容易寫一個遞歸算法計算m[ 1 ][ n ]。但是簡單地遞歸將好費指數計算時間。在遞歸計算時,許多子問題被重復計算多次。這也是該問題可以用動態規劃算法求解的又一顯著特征。
用動態規劃算法解決此問題,可依據其遞歸是以自底向上的方式進行計算。在計算的過程中,保存以解決的子問題答案。每個子問題只計算一次,而在后面需要時只要簡單查一下,從而避免大量的重復計算。
總結
以上是生活随笔為你收集整理的矩阵连乘问题(c++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: amd cpu不能在cmd环境下运行ja
- 下一篇: C++学习之路 | PTA乙级—— 10