第十五章動態規劃之“矩陣鏈乘法”

來源:互聯網
上載者:User

裝配線調度與矩陣鏈乘法是很典型的動態規劃的兩個例子。關於這倆例子對於理解動態規劃的作用稍後補上。這個程式的時間複雜度為Ω(n^3),這個可以通過替換法證明。

輸出最優加括弧的代碼對於理解遞迴很有協助,蹭蹭蹭,先往回跑,路上什麼也不幹,跑到頭再跑回來,把該乾的都幹了,先自頂向下,再自底向上。

代碼如下:

#include <iostream>using namespace std;void MatrixChainOrder(int (*a)[2],unsigned int (*m)[7],int (*s)[7]){for(int i=1;i<=6;i++){m[i][i]=0;}for(int l=2;l<=6;l++){for(int i=1;i<=6-l+1;i++){int j=i+l-1;m[i][j]=1<<31;for(int k=i;k<j;k++){//cout<<m[i][j];system("pause");int temp=m[i][k]+m[k+1][j]+a[i][0]*a[k][1]*a[j][1];if(m[i][j]>temp){m[i][j]=temp;s[i][j]=k;}}}}}void PrintOpticalOrder(int i,int j,int (*s)[7]){if(i==j){cout<<"A"<<i;}else{cout<<"(";PrintOpticalOrder(i,s[i][j],s);PrintOpticalOrder(s[i][j]+1,j,s);cout<<")";}}int main(){int n=6;int a[7][2]={{0,0},{30,35},{35,15},{15,5},{5,10},{10,20},{20,25}};unsigned int m[7][7];int s[7][7]={{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0}};MatrixChainOrder(a,m,s);PrintOpticalOrder(1,6,s);//cout<<m[1][6]<<" "<<s[1][6];system("pause");}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.