简单的ABC矩阵连乘这里就不写代码了,现在说说关于ABCDEF....矩阵连乘问题的计算顺序问题:
递归解法:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 #define SIZE 100 7 #define INF 999999999 8 int m[SIZE]; 9 int n; 10 int memo[SIZE][SIZE]; 11 int Best_Memo(int m[], int left, int right); 12 13 //m数组内存放矩阵链的行列信息 14 //m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...) 15 int Best_Enum(int m[], int left, int right) 16 { 17 //只有一个矩阵时,返回计算次数0 18 if (left == right) 19 { 20 return 0; 21 } 22 23 int min = INF; //无穷大 24 int i; 25 //括号依次加在第1、2、3...n-1个矩阵后面,每次加括号的方式是一样的,所以可以递归。 26 for (i = left; i < right; i++) 27 { 28 //计算出这种完全加括号方式的计算次数 29 int count = Best_Enum(m, left, i) + Best_Enum(m, i+1, right); 30 count += m[left-1] * m[i] * m[right]; 31 //选出最小的 32 if (count < min) 33 { 34 min = count; 35 } 36 } 37 return min; 38 } 39 40 41 int main(void) 42 { 43 scanf("%d", &n); 44 for (int i = 0; i < n; i++) 45 { 46 scanf("%d", &m[i]); 47 } 48 49 // printf("%d ", Best_Enum(m, 1, n-1)); 50 memset(memo, 0, sizeof(memo)); 51 printf("%d ", Best_Memo(m, 1, n-1)); 52 return 0; 53 } 54 55 56 //Best_Enum() 的优化 57 int Best_Memo(int m[], int left, int right) 58 { 59 //只有一个矩阵时,返回计算次数0 60 if (left == right) 61 { 62 return 0; 63 } 64 65 int min = INF; 66 int i; 67 //括号依次加在第1、2、3...n-1个矩阵后面 68 for (i = left; i < right; i++) 69 { 70 //计算出这种完全加括号方式的计算次数 71 int count; 72 if (memo[left][i] == 0)//如果没有计算过,就进入递归来计算 73 { 74 memo[left][i] = Best_Memo(m, left, i); 75 } 76 count = memo[left][i]; //如果计算过,就直接用 77 78 if (memo[i+1][right] == 0) 79 { 80 memo[i+1][right] = Best_Memo(m, i+1, right); 81 } 82 count += memo[i+1][right]; 83 84 count += m[left-1] * m[i] * m[right];//加上代价 85 //选出最小的 86 if (count < min) 87 { 88 min = count; 89 } 90 } 91 return min; 92 }
动态规划解法:
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 #define MAX 99999999 5 int n; 6 int data[105]; 7 8 int main(){ 9 cin>>n; 10 memset(data,-1,sizeof(data)); 11 for(int i=0;i<n;i++ ){ 12 cin>>data[i]; 13 } 14 15 int result[n+1][n+1]; 16 memset(result,0,sizeof(result)); 17 18 for(int s=1;s<=n-1;s++){ 19 for(int i=1,j=i+s;j<n;i++,j++){ 20 int min=MAX; 21 for(int k=i;k<j;k++){ 22 int count=result[i][k]+result[k+1][j]+data[i-1]*data[k]*data[j]; 23 if(count<min){ 24 min=count; 25 } 26 } 27 result[i][j]=min; 28 } 29 } 30 31 cout<<result[1][n-1]; 32 }