基础题:矩阵连乘问题
矩阵连乘问题:
先考察3个矩阵{A1,A2,A3}连乘,设这三个矩阵的维数分别为10×100,100×5,5×50。若按((A1A2)A3)方式需要的数乘次数为10×100×5+10×5×50=7500,若按(A1(A2A3))方式需要的数乘次数为100×5×50+10×100×50=75000。
矩阵连乘问题是《算法导论》的一道经典题目;
思想:将一系列相乘的矩阵(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.本文就是为以后的题目作引用的,用于区别其他的题目,在对比中体会其中的思想;并经典的题目总给我们提供一个思想原型,以不变应万变。