1.问题
设A1,A2,…,An为n个矩阵的序列,其中Ai为Pi-1 x Pi 阶矩阵,这个矩阵链的输入用向量P = <P0,P1,…,Pn>给出。
给定向量P,确定一种乘法次序,使得基本运算总次数最小。
2,解析
Ai-j :
表示矩阵链相乘的子问题Ai Ai+1 … Aj.
m[i…j] : 表示得到乘积Ai…j 所用的最少基本运算次数 ;
当i = j , m[i…j]=0;
当i < j , m[i…j]= min{m[i,k]+m[k+1,j]+Pi-1 * Pk * Pj} i<=k<j
3.设计
Ai…j 的输入向量 P = <Pi-1,Pi,…,Pj> 1<=i<=j<=n
输出 计算Ai…j 所需最小乘法运算次数dp[i…j] 和最后一次运算的位置s[i…j]
例如 Ai…j = (Ai…Ak)(Ak+1…Aj)
s[i…j] = k
RecurMatrixChain(P[],n){
dp[][]=inf
s[][]
for (i from 1 to n-1)
dp[i][i+1] = P[i] * P[i+1] * P[i+2]
dp[i][i]=0
for 确定长度
for 确定起点,终点
for 确定分割点k
if dp[i][j] > dp[i][k] + dp[k+1][j] + P[i] * P[k+1] * P[j+1]
更新dp[i][j] s[i][j] = k
}
4,分析
T= O(n^3)
5,源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int MAXN = 10;
const int inf = 0x3f3f3f3f;
void RecurMatrixChain(int P[], int n) {