矩阵连乘

今天药忘吃喽~ 2022-07-15 07:56 294阅读 0赞

递归:

  1. #include<stdio.h>
  2. #define N 6
  3. int m[N][N]; //最小乘法次数
  4. int RecurMatrixChain(int P[],int i,int j) {
  5. m[i][j]= 100000;
  6. if(i== j)
  7. m[i][j]=0;
  8. else {
  9. for(int k=i; k<j; k++) {
  10. int q=RecurMatrixChain(P,i,k)+RecurMatrixChain(P,k+1,j)+P[i]*P[k+1]*P[j+1];
  11. if(q<m[i][j]) {
  12. m[i][j]=q;
  13. }
  14. }
  15. }
  16. return m[i][j];
  17. }
  18. int main() {
  19. int P[N+1]= {30,35,15,5,10,20,25};
  20. for(int i=0; i<N; i++)
  21. m[i][i]=0;
  22. printf("%d",RecurMatrixChain(P,0,N-1));
  23. return 0;
  24. }

动态规划:

  1. #include <stdio.h>
  2. #define N 6
  3. int m[6][6];//最优解
  4. void matrix(int p[]) {
  5. int i;
  6. int j;
  7. for(i=2; i<=6; i++)
  8. for(j=0; j<6-i+1; j++) {
  9. m[j][j+i-1]=1000000;
  10. int k;
  11. for(k=0; k<i-1; k++) {
  12. if(m[j][j+i-1]>m[j][j+k]+m[j+k+1][j+i-1]+p[j]*p[j+k+1]*p[j+i])
  13. {
  14. m[j][j+i-1]=m[j][j+k]+m[j+k+1][j+i-1]+p[j]*p[j+k+1]*p[j+i];
  15. }
  16. }
  17. }
  18. }
  19. int main() {
  20. int p[7]= {30,35,15,5,10,20,25};
  21. for(int i=0; i<6; i++)
  22. m[i][i]=0;
  23. matrix(p);
  24. printf("%d\n",m[0][5]);
  25. return 0;
  26. }

备忘录:

  1. #include <stdio.h>
  2. #define N 6
  3. int m[N][N],s[N][N];//最优解
  4. int p[7]= {30,35,15,5,10,20,25};
  5. int lookupChain(int i, int j) {
  6. if(m[i][j]>0) return m[i][j];
  7. if(i==j) return 0;
  8. int u=lookupChain(i+1, j) + p[i-1]*p[i]*p[j];
  9. s[i][j] = i;
  10. for(int k=i+1; k<j; k++) {
  11. int t = lookupChain(i,k) + lookupChain(k+1, j) + p[i-1]*p[k]*p[j];
  12. if(t<u) {
  13. u=t;
  14. s[i][j] = k;
  15. }
  16. }
  17. m[i][j] = u;
  18. return u;
  19. }
  20. int memoizedmatrixChain(int n) {
  21. for(int i=1; i<=n; i++)
  22. for(int j=i; j<=n; j++)
  23. m[i][j] = 0;
  24. return lookupChain(1, n);
  25. }
  26. int main() {
  27. for(int i=0; i<6; i++)
  28. m[i][i]=0;
  29. printf("%d\n",memoizedmatrixChain(N));
  30. return 0;
  31. }

发表评论

表情:
评论列表 (有 0 条评论,294人围观)

还没有评论,来说两句吧...

相关阅读

    相关 矩阵

    给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数

    相关 矩阵问题

    问题描述:给定一组可以连乘的矩阵,求最佳相乘顺序,使得总的计算次数最少。 参考代码: 方法一:动态规划 include <stdio.h>