矩阵连乘


代码:

public class MatrixMulitply {  

    public static void main(String[] args) {  

        int[] matrixChain = {30, 35, 15, 5, 10, 20, 25};  

        matrixMultiply(matrixChain);  

    }  

    //矩阵连乘  

    public static void matrixMultiply(int[] matrixChain) {  

        int dimension = matrixChain.length;  

        int[][] timeResult = new int[dimension][dimension];  

        int[][] tagResult = new int[dimension][dimension];  

          

        matrixMultiply(matrixChain, timeResult, tagResult);  

          

        System.out.println("最优乘法次数:" + timeResult[1][dimension - 1]);  

        System.out.println("划分规则为:");  

        traceBack(tagResult, 1, dimension - 1);  

    }  

    //矩阵连乘  

    public static void matrixMultiply(int[] matrixChain, int[][] timeResult, int[][] tagResult) {  

        //timeResult 存放次数结果,矩阵的的行与列以1开始,tagResult 存放标记结果,矩阵的的行与列以1开始  

        int n = matrixChain.length - 1;  

        for(int i = 1; i <= n; i++)  //初始化矩阵  

            timeResult[i][i] = 0;  

        for(int r = 2; r <= n; r++)  //从列号的第二位开始  

            for(int i = 1; i <= n - r + 1; i++ ) {   //i为行号    

                int j = i + r - 1;  //j为列号  

                timeResult[i][j] = timeResult[i + 1][j] + matrixChain[i - 1] * matrixChain[i] * matrixChain[j];  

                tagResult[i][j] = i;      

                for(int k = i + 1; k < j; k++) { //  

                    int temp = timeResult[i][k] + timeResult[k + 1][j] + matrixChain[i - 1] * matrixChain[k] * matrixChain[j];  

                    if(temp < timeResult[i][j]) {    //寻找最小值  

                        timeResult[i][j] = temp;  

                        tagResult[i][j] = k;    //记录划分标记  

                    }  

                }  

            }  

          

    }  

    //按计算出断点矩阵tagResult指示的加括号方式  

    public static void traceBack(int[][] tagResult, int i, int j) {  

        if(i == j) return;  

            traceBack(tagResult, i, tagResult[i][j]);  

            traceBack(tagResult, tagResult[i][j] + 1, j);  

            System.out.println("Multiply A(" + i + "," + tagResult[i][j] + ")and A(" + (tagResult[i][j] + 1) + "," + j + ")");  

    }  

}  

运行结果:

最优乘法次数:15125

划分规则为:

Multiply A(2,2)and A(3,3)

Multiply A(1,1)and A(2,3)

Multiply A(4,4)and A(5,5)

Multiply A(4,5)and A(6,6)

Multiply A(1,3)and A(4,6)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值