装配线调度与矩阵链乘法是很典型的动态规划的两个例子。关于这俩例子对于理解动态规划的作用稍后补上。这个程序的时间复杂度为Ω(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
{
c