算法初步:动态规划——矩阵连乘问题的解决

题目描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如:

矩阵连乘,举例3个矩阵(A,B,C);

class 矩阵{

    int 2维数组;//用于存放矩阵的元素

    int 行;

    int 列;

}A,B,C;

满足连乘的关系:A.列=B.行;B.列=C.行;


假设这三个矩阵不相同;A[3][4],B[4][5],C[5][6];

这样(A*B)*C的次数为:3*4*5+3*5*6=150

同理A*(B*C)次数       :4*5*6+3*4*6=192

明显用不同的运算顺序结果不同;

如何设计算法?

1第一个自然是穷举,把所有可能性来一遍自然会有答案

2动态规划

动态规划的设计有4个步骤:   (1).找出最优解的性质,并刻画其结构特征

                                          (2).递归地定义最优值                                           

                                          (3).以自底向上的方式计算出最优值

                                          (4).根据计算最优值时得到的信息(及存放最优值的表格),构造最优解

首先用一个一维数组m[i-1]存储第i个矩阵的行信息,用m[i]存储第i个矩阵的列信息。

假设                                               ABCD

               (ABC)D        ——————————————      A(BCD)             return 最小值


(ABC)D  ——  A(BC)D    return 最小值             A(BCD)   ———   A(BC(D))    return 最小值 

        

根据此图示写出相应代码:

int Cheng(int m[],int left,int right)
{
    if(left == right)
        return 0;
    int min;
    int i;
    for(i = left;i < right;i ++)
    {
        int count = Cheng(m,left,i)+Cheng(m,i+1,right);
        count += m[left-1] * m[i] * m[right];
        if (count < min)  
        {  
            min = count;  
       
        }
    }
    return min;

}






发布了36 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_36812792/article/details/80085373