问题的陈述就省了,网上很多。
想谈一下动态规划和递归。先说递归,递归的核心是,将一个复杂的,规模庞大的问题,一步步的,把问题规模变小,直到问题简单到可以直接解决。
那么动态规划就更近一步,很多问题如果直接递归,那么往往会出现重复计算同一个值很多次的问题,这是一个很大的代价,因此,动态规划将记录子过程的计算结果,再需要的时候直接使用,避免了重复计算的问题,大大减小了代价。
下面是矩阵链相乘的代码实现,注释写的较为详细了。
#include<iostream>
using namespace std;
#define LEN 5//以5个矩阵为例,编号从0开始
int main(){
int d=1;//d是指间隔长度
int r[LEN+1]={5,10,4,6,10,2};//r[i][i+1]代表第i号矩阵的行和列
int c[LEN][LEN];//这个矩阵为动态规划的精髓,记录了每一个子过程的结果,
//从而避免了大规模的重复计算,c[i][j]代表了从i号矩阵到j号矩阵的最小代价
for(int i=0;i<LEN;i++){
c[i][i]=0;
}
for(d=1;d<LEN;d++){//5个矩阵,那么间距自然最大就是4
for(int i=0;i<=LEN-d-1;i++){
int j=i+d;
c[i][j]=10000;//代替无穷大
for(int k=i+1;k<=j;k++){//k代表了一个划分,例如,要计算c[1][3],那么
//k可以取2和3,取2时代表,划分为c[1][1]和c[2][3],取3时代表,
//划分为c[1][2]和c[3][3]
int temp=(c[i][k-1]+c[k][j]+r[i]*r[k]*r[j+1]);
if (temp<c[i][j])
c[i][j]=temp;//取最小代价
}
}
}
return c[0][4];
}