日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

矩阵连乘问题(c++)

發布時間:2024/7/23 c/c++ 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 矩阵连乘问题(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]給出了最優值,即計算A[i:j]所需的最少數乘次數。同時還確定了計算A[i:j]的最優次序中的斷開位置k,也就是說,對于這個k有m[i][j]=m[i[k]+m[k+1][j] + Pi-1*Pk*Pj

若將對應于m[i][j]的斷開位置k記為s[i][j],在計算最優值m[i][j]后,可以遞歸地有s[i][j]構造出相應的最優解。

  • 計算最優值

    根據計算m[ i ][ j ]的遞歸式,容易寫一個遞歸算法計算m[ 1 ][ n ]。但是簡單地遞歸將好費指數計算時間。在遞歸計算時,許多子問題被重復計算多次。這也是該問題可以用動態規劃算法求解的又一顯著特征。
    用動態規劃算法解決此問題,可依據其遞歸是以自底向上的方式進行計算。在計算的過程中,保存以解決的子問題答案。每個子問題只計算一次,而在后面需要時只要簡單查一下,從而避免大量的重復計算。

  • #include<iostream> #include<cstring> using namespace std; const int maxsize = 100; int p[maxsize]{ 30,35,15,5,10,20,25 }; int m[maxsize][maxsize], s[maxsize][maxsize];//m[i][j]存儲最優解 int n = 6;void MatrixChain() {int i, r, j, k;for (int i = 1; i <= n; i++) { m[i][i] = 0;//對角線為0;規模為1時;}for (r = 2; r <= n; r++)//矩陣連乘的規模為r ,從2開始{for (i = 1; i <= n - r + 1; i++)//最大可起始點{j = i + r - 1;//j-i=r-1;m[i][j] = 0x7f7f7f7f;//另開始時m[i][j]為無窮大;s[i][j] = i;//s[][]存儲各子問題的決策點,即一開始k為該點。for (k = i; k < j; k++)//尋找最優值{int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];//求出分割點為k時的乘積if (t < m[i][j])//求出最小值,將分割點s[i][j]設置為k;{m[i][j] = t;s[i][j] = k;}}}} }void print(int i, int j) {if (i == j)//回歸條件{cout << "A" << i << "";return;}cout << "(";print(i, s[i][j]);print(s[i][j] + 1, j);//遞歸1到s[1][j]cout << ")"; }int main() {MatrixChain();print(1, n);cout << endl;cout << m[1][n] << endl; }

    總結

    以上是生活随笔為你收集整理的矩阵连乘问题(c++)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。