基础题:矩阵连乘问题

矩阵连乘问题:

先考察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.本文就是为以后的题目作引用的,用于区别其他的题目,在对比中体会其中的思想;并经典的题目总给我们提供一个思想原型,以不变应万变。

你可能感兴趣的:(基础)