阅读以下说明和C代码,根据要求回答问题1~问题3。 【说明】 某工程计算中要完成多个矩阵相乘(链乘)的计算任务。两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算A m×n *B n×p ,需要m*n*p次乘法运算。矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵A 110×100 ,A2 100×5 ,A3 5×50 三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行10*100*5+10*5*50=7500次乘法运算;若按A1*(A2*A3)计算,则需要进行100*5*50+10*100*50=75000次乘法运算。可见不同的计算顺序对计算量有很大的影响。矩阵链乘问题可描述为:给定n个矩阵 n>,矩阵Ai的维数为Pi-1×Pi,其中i=1,2,…,n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。由于可能的计算顺序数量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若AI*A2*…*An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*…*Ak和Ak+1*Ak+2*…*An两个子问题,则该最优解应该包含A1*A2*…*Ak的一个最优计算顺序和Ak+1*Ak+2*…*An的一个最优计算顺序。据此构造递归式, [*] 其中,cost[i][j]表示Ai+1*Ai+2*…*Aj+1的最优计算的计算代价。最终需要求解cost[0][n—1]。 【C代码】 算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵……n个矩阵相乘的最小计算量及最优计算顺序。下面是该算法的C语言实现。 (1)主要变量说明 n:矩阵数 seq[]:矩阵维数序列 cost[][]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2*……*Aj+l的最优计算的计算代价 trace[][]:二维数组,长度为n*n,其中元素trace[i][j]表示Ai+1*Ai+2:i:…*Aj+1的最优计算对应的划分位置,即k (2)函数cmm
#define N 100
int cost [N]IN];
int trace [N][N];
int cmm(int n,int seq[]){
int tempCost;
int tempTrace;
int i,j,k , P;
int temp;
for(i=0;itemp){
tempCost=temp;
(4)
}
}
cost[i][j]=tempCost;
trace[i][j]=tempTrace:
}
}
return cost[0][n—1];
}

问答题 根据以上说和C代码,填充C代码中的空(1)~(4)。
【正确答案】正确答案:(1)i
【答案解析】解析:上述算法中,第一个循环是给n个cost[i][i]附赋初值0;第2个循环是个外循环,其循环变量p是矩阵连乘的规模,(p:1时)先计算出所有规模为2的cost[i,i+1],(p=2时)再计算出所有规模为3的cost[i,i+2],……,最后计算出来的即为我们所求的cost[1,n—1],所以(1)填i
问答题 根据以上说明和C代码,该问题采用了(5)算法设计策略,时间复杂度为(6)(用0符号表示)。
【正确答案】正确答案:(5)动态规划(6)O(n^3)
【答案解析】解析:求min(i≤k
问答题 考虑实例n=6,各个矩阵的维数:A1为5*10,A2为10*3,A3为3*12,A4为12*5,A5为5*50,A6为50*6,即维数序列为5,10,3,12,5,50,6。则根据上述C代码得到的一个最优计算顺序为(7)(用加括号方式表示计算顺序),所需要的乘法运算次数为(8)。
【正确答案】正确答案:(7)(A1*A2)*((A3*A4)*(A5*A6))(8)2010
【答案解析】解析:根据以上分析可知:最优子序列为(A1*A2)*((A3*A4)*(A5*A6))(用加括号方式表示计算顺序),所需要的乘法运算次数为2010。