矩阵相乘

简单的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\n", Best_Enum(m, 1, n-1));
50     memset(memo, 0, sizeof(memo));
51     printf("%d\n", 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 } 

 

posted on 2015-11-23 00:25  逸阳  阅读(195)  评论(0编辑  收藏  举报

导航