基础题:矩阵连乘问题

矩阵连乘问题:

先考察3个矩阵{A1,A2,A3}连乘,设这三个矩阵的维数分别为10×100100×55×50。若按((A1A2A3)方式需要的数乘次数为10×100×510×5×507500,若按(A1A2A3))方式需要的数乘次数为100×5×5010×100×5075000

矩阵连乘问题是《算法导论》的一道经典题目;

思想:将一系列相乘的矩阵(Ai....Aj)划分为两部分;即(AiAi+1...Ak)(Ak+1Ak+2....Aj),k的位置要保证左边括号和右边括号相乘的消耗最小。划分为解子问题,并符合动态规划条件,详解还是看算法导论吧!

 1 int func32(int a[], int n)
 2 {
 3     int i,j, k;
 4 
 5     int *m, tmp;
 6 
 7     assert(n>=2);
 8 
 9     m = new int[n*n];
10 
11     for (i=0; i<n*n; ++i)
12     {
13         m[i] = INT_MAX;
14     }
15 
16     for (j=1; j< n; j++)
17     {
18         for (i=j; i>=1; i--)
19         {
20             if (i==j)
21             {
22                 m[i*n+j] = 0;
23                 continue;
24             }
25             for (k=i; k<j; k++)
26             {
27                 tmp = m[i*n+k] + m[(k+1)*n+j] + a[i-1]*a[j]*a[k];
28                 if (m[i*n+j] > tmp)
29                 {
30                     m[i*n+j] = tmp;
31                 }
32             }
33         }
34     }
35 
36     tmp = m[1*n+ n-1];
37 
38     delete[] m;
39 
40     return tmp;
41 }

居然这道题也要折腾了哥N久的时间,而且现在都感觉那里不正确。。。。

 

P.S.本文就是为以后的题目作引用的,用于区别其他的题目,在对比中体会其中的思想;并经典的题目总给我们提供一个思想原型,以不变应万变。

posted @ 2013-05-05 20:52  legendmaner  阅读(1122)  评论(0编辑  收藏  举报