裝配線調度與矩陣鏈乘法是很典型的動態規劃的兩個例子。關於這倆例子對於理解動態規劃的作用稍後補上。這個程式的時間複雜度為Ω(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");}