矩阵连乘(DP+递归+备忘录)



动态规划+递归+备忘录 解决矩阵连乘

问题描述:

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

矩阵之间相乘的公式:


矩阵连乘(DP+递归+备忘录)_第1张图片
矩阵相乘公式

为什么会有矩阵连乘这个问题呢?

看下面一个例子,计算三个矩阵连乘{A1,A2,A3};维数分别为10*100 , 100*5 , 5*50 按此顺序计算需要的次数((A1*A2)*A3):10X100X5+10X5X50=7500次,按此顺序计算需要的次数(A1*(A2*A3)):10*5*50+10*100*50=75000次
  所以,确定一个最优的运算顺序,可以使计算量达到最小化。

动态规划解决:
#include
#define N 6

void RecurMatrixChain(int* p,int** m){
    for(int r=2;r
递归:
#include
#define N 6

int RecurMatrixChain(int* p,int** s,int i,int j){
    if(i==j){
        return 0;
    }
    int u=32767;//代表从i到j的最少数乘次数
    for(int k=i;k
备忘录:
#include
#define N 6

int MemoMatrixChain(int* p,int** s,int** m,int i,int j){
    if(m[i][j]!=-1){
        return m[i][j];
    }
    if(i==j){
        return 0;
    }
    int u=32767;//u代表从i到j的最少数乘次数
    for(int k=i;k
矩阵连乘(DP+递归+备忘录)_第2张图片
运行截图

你可能感兴趣的:(矩阵连乘(DP+递归+备忘录))