栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

矩阵链乘法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

矩阵链乘法

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

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];

               
                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];
                   
                    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 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))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/284214.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号