题目描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如:
矩阵连乘,举例3个矩阵(A,B,C);
class 矩阵{
int 2维数组;//用于存放矩阵的元素
int 行;
int 列;
}A,B,C;
满足连乘的关系:A.列=B.行;B.列=C.行;
假设这三个矩阵不相同;A[3][4],B[4][5],C[5][6];
这样(A*B)*C的次数为:3*4*5+3*5*6=150
同理A*(B*C)次数 :4*5*6+3*4*6=192
明显用不同的运算顺序结果不同;
如何设计算法?
1第一个自然是穷举,把所有可能性来一遍自然会有答案
2动态规划
动态规划的设计有4个步骤: (1).找出最优解的性质,并刻画其结构特征
(2).递归地定义最优值
(3).以自底向上的方式计算出最优值
(4).根据计算最优值时得到的信息(及存放最优值的表格),构造最优解
首先用一个一维数组m[i-1]存储第i个矩阵的行信息,用m[i]存储第i个矩阵的列信息。
假设 ABCD
(ABC)D —————————————— A(BCD) return 最小值
(ABC)D —— A(BC)D return 最小值 A(BCD) ——— A(BC(D)) return 最小值
根据此图示写出相应代码:
int Cheng(int m[],int left,int right)
{
if(left == right)
return 0;
int min;
int i;
for(i = left;i < right;i ++)
{
int count = Cheng(m,left,i)+Cheng(m,i+1,right);
count += m[left-1] * m[i] * m[right];
if (count < min)
{
min = count;
}
}
return min;
}