//用备忘录方法来求解矩阵连乘问题
int s[NUM][NUM];
int m[NUM][NUM];
//s,m数组分别初始化为0,用于记录断开位置和最优计算次数
int LookUpChain(int i,int j) //i,j为矩阵范围
{
if(m[i][j]>0) //说明已经计算过了
{
return m[i][j];
}
if(i==j)
{
return 0;
}
//循环递归式
int u=LookUpChain(i,i)+LookUpChain(i+1,j)+p[i-1]*p[i]*p[j];
s[i][j]=i; //记录断开位置
for(int k=i+1;k<j;k++)
{
int t=LookUpChain(i,k)+LookUpChain(k+1,j)+p[i-1]*p[k]*p[j];
if(t<u)
{
u=t;
s[i][j]=k; //更新断开位置
}
m[i][j]=u;
return u; //返回计算次数
}
}
数组p存储的是矩阵的维数矩阵连乘,使用备忘录,不知道算不算DP的一种?
最新推荐文章于 2022-04-10 13:37:10 发布