矩阵链乘法

2 篇文章 0 订阅

书上的例子,加回溯求出加()结果。

import java.util.ArrayList;
import java.util.stream.Collectors;

public class MatrixChain {
  
    int matrixChain(int[] p) {
        int n = p.length - 1;

        int[][] m = new int[n + 1][n + 1]; 
        int[][] s = new int[n + 1][n + 1];
        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];

               /* System.out.println(String.format("i=%d, k=%d, j=%d, m[%d][%d] = %d ,m[%d+1][%d]=%d, " +
                                "p[%d-1] * p[%d] * p[%d]= %d , m[%d][%d] = %d "
                        , i, i, j, i, i,m[i][i],  i, j, m[i + 1][j], i, i, j, p[i - 1] * p[i] * p[j], i, j, m[i][j]));*/
                s[i][j] = i;
                for (int k = i + 1; k < j; k++) {
                    int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                   /* System.out.println(String.format("i=%d, k=%d, j=%d, m[%d][%d] = %d ,m[%d+1][%d]=%d, " +
                                    "p[%d-1] * p[%d] * p[%d]= %d , m[%d][%d] = %d ", i, k, j, i, k, m[i][k], k, j, m[k + 1][j]
                            , i, k, j, p[i - 1] * p[k] * p[j], i, j, t));*/
                    if (t < m[i][j]) {
                        m[i][j] = t;
                        s[i][j] = k;
                    }

                }

            }
        }
        stringArrayList.add("(");
        for (int i = 1; i <= 6; i++) {
            stringArrayList.add("A" + i);
        }
        addPara(s, 1, n);
        stringArrayList.add(")");
        String result = stringArrayList.stream().collect(Collectors.joining("")).toString();
        System.out.println(result);


        System.out.println(m[1][n]);
        return m[1][n];
    }

    ArrayList<String> stringArrayList = new ArrayList<>();

    public void sbAppend(int low, int high) {
        if (low == high) { //只有一个元素时,不加()
            return;
        }
        stringArrayList.set(low, "(" + stringArrayList.get(low));
        stringArrayList.set(high, stringArrayList.get(high) + ")");

    }

    void addPara(int[][] s, int low, int high) {
        if (low == high) {
            return;
        }
        int index = s[low][high];
        sbAppend(low, index);
        addPara(s, low, index);
        sbAppend(index + 1, high);
        addPara(s, index + 1, high);
    }

    public static void main(String[] args) {
        int[] p = new int[]{30, 35, 15, 5, 10, 20, 25};
        MatrixChain matrixChain = new MatrixChain();
        int maxTimes = matrixChain.matrixChain(p);
    }
}

输出结果

((A1(A2A3))((A4A5)A6))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值