美文网首页
矩阵链乘法

矩阵链乘法

作者: moosoo | 来源:发表于2016-06-23 18:10 被阅读179次

递归算法:

#include<string>
#include<cstring>
#include<iostream>
using namespace std;

int n;
int p[100];
int m[100][100];
int s[100][100];
int dp(int i,int j){
    if(i==j)               /*如果只有一个矩阵就直接返回*/
        return m[i][j];
    m[i][j]=999999999;     /*将m[i][j]设为无穷大*/
    s[i][j]=i;
    for(int k=i;k<j;k++){  /*将i到j个矩阵分为i到k和k+1到j个矩阵*/
        int q=dp(i,k)+dp(k+1,j)+p[i-1]*p[k]*p[j]; 
        if(q<m[i][j]){      /*如果有更小的方案更新*/
            m[i][j]=q;
            s[i][j]=k;
        }
    }
    return m[i][j];         
}
int main(){
    while(cin>>n){
        for(int i=0;i<=n;i++){  /*输入矩阵链*/
            cin>>p[i];
        }
        memset(m,0,sizeof(m));    /*初始化*/
        dp(1,n);                    /*查找目标1到n个矩阵链乘*/
        cout<<m[1][n]<<" "<<s[1][n]<<endl;
    }
    return 0;
}

迭代算法:

#include<string>
#include<cstring>
#include<iostream>
using namespace std;

int main(){
    int n;
    int p[100];
    while(cin>>n){
        for(int i=0;i<=n;i++){   /*输入矩阵链*/
            cin>>p[i];
        }
        int m[100][100];            /*存最少操作*/
        int s[100][100];            /*存最后一次操作的位置*/
        memset(m,0,sizeof(m));      /*初始化m数组*/
        for(int i=0;i<=n;i++){                                  
            for(int j=i;j<=n;j++){
                s[i][j]=i;          /*初始化s数组*/
            }
        }
        for(int r=2;r<=n;r++){          /*操作的矩阵数*/
            for(int i=1;i<=n-r+1;i++){
                int j=i+r-1;
                m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];   /*将第一个矩阵与其它矩阵分开*/
                s[i][j]=i+1;
                for(int k=i+1;k<j;k++){                 /*将前K个矩阵与后面的矩阵分开*/
                    int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
                    if(t<m[i][j]){      /*有更好的方法则更新*/
                        m[i][j]=t;
                        s[i][j]=k;
                    }
                }
            }
        }
        cout<<m[1][n]<<" "<<s[1][n]<<endl;
    }
    return 0;
}

分析

递归算法:规模为n的问题,有n个递归,每个递归又有相应矩阵个数个递归,故T(n)=T(1)+T(n-1)+1+T(2)+T(n-2)+1......+T(n-1)+T(1)+1=n-1+2*(T(1)+T(2)+......T(n-1))=O(n^2)。
迭代算法:规模为n的问题,用迭代算法,即用已知值计算新值,需要将问题划分成两个一组、三个一组......n个一组的子问题,故
T(n)=T(n-1)+T(n-2)+T(n-3)......+T(1)=O(n^2).

相关文章

  • 矩阵链乘法

    矩阵A和矩阵B能够相乘,只有当矩阵A和矩阵B相容。 矩阵链乘法的前提就是降低矩阵的乘法规模。之所以可以这样,是因为...

  • 矩阵链乘法

    递归算法: 迭代算法: 分析 递归算法:规模为n的问题,有n个递归,每个递归又有相应矩阵个数个递归,故T(n)=T...

  • 矩阵链乘法

    887鸡蛋掉落 312戳气球 132分割回文串 375猜数字大小

  • LRJ入门经典(基础篇)——3.矩阵链乘

    3.矩阵链乘 问题描述:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果无法进行,输出error.如果...

  • (7) 动态规划(下) 矩阵链乘与OBST树

    矩阵链乘问题 问题描述:如何实现对A1·A2·A3...An个矩阵链乘的打括号(分割), 使得其乘法次数m是最少的...

  • 矩阵链的乘法问题

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题1——矩阵链...

  • 图形变换原理

    概述: 图形变换大体分为缩放,平移,拉伸,旋转.他们的原理是矩阵的乘法. 矩阵的乘法: 矩阵的乘法规则:两个矩阵相...

  • 矩阵乘法在python中的表示

    从数学表达上来说,矩阵乘法有: 矩阵的乘法(matmul product):这就是线性代数里面的矩阵乘法 內积/点...

  • sparse matrix 的分布式存储和计算

    矩阵乘法 我们先来补充一下矩阵乘法的数学知识: 矩阵乘法的意义: 对一个矩阵进行左乘一个矩阵的运算,相当于对该矩阵...

  • 图形矩阵-----Matrix

    一、矩阵的定义 二、矩阵与矩阵的乘法 矩阵的乘法满足以下运算律:结合律,分配律,但是矩阵乘法不满足交换律。更详细的...

网友评论

      本文标题:矩阵链乘法

      本文链接:https://www.haomeiwen.com/subject/suqodttx.html