15.2 矩阵链乘法

news2025/1/22 15:55:36

1.代码

public class MatrixChainMultiplication {
    public static void main(String[] args) {
//        在该代码中,我们首先创建了两个n * n的矩阵m和s,分别用于记录最优值和分割点。 其中m 矩阵 通过i j 来显示在i到j的矩阵链中最优解
//
//        然后,我们将i = j时的m[i][j]赋值为0,因为一个矩阵的乘积为0。
//
//        接下来,我们使用L循环枚举子问题规模,i循环枚举左端点,j循环枚举右端点,并使用k循环枚举分割点。
//
//        对于每个分割点k,我们计算最优值q,然后将q与m[i][j]进行比较,如果q小于m[i][j],则更新m[i][j]和s[i][j]。
//        通过公式算法导论15.7
//
//        最后,我们返回m[1][n-1],即原问题的最优值。
//
//        该算法的时间复杂度为O(n^3),其中n是矩阵的数量。
        int[] p = {30, 35, 15, 5, 10, 20, 25};
        System.out.println("最少的乘法次数为:" + matrixChainOrder(p));
    }
​
    public static int matrixChainOrder(int[] p) {
        int n = p.length;
        // 创建n * n的矩阵m和s,用于记录最优值和分割点
        int[][] m = new int[n][n];
        int[][] s = new int[n][n];
        // i==j时,m[i][j]=0,因为一个矩阵的乘积为0
        for (int i = 1; i < n; i++) {
            m[i][i] = 0;
        }
        for (int i = 0; i < m.length; i++) {
            System.out.println(Arrays.toString(m[i]));
        }
​
        // L是子问题规模
        for (int L = 2; L < n; L++) {
            // i是左端点,j是右端点,k是分割点
            for (int i = 1; i < n - L + 1; i++) {
                int j = i + L - 1;
                m[i][j] = Integer.MAX_VALUE;
                // 枚举分割点k,求解最优值
                for (int k = i; k < j; k++) {
                    int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                    System.out.println("m[i][k]: "+m[i][k] );
                    System.out.println("m[k + 1][j]: "+m[k + 1][j]);
                    System.out.println("i:"+i+" k:"+k+" j:"+j);
                    System.out.println(q);
                    if (q < m[i][j]) {
                        m[i][j] = q;
                        s[i][j] = k;
                    }
                }
            }
        }
        // 返回最优值
        return m[1][n - 1];
    }
​
​
}

2.原理

自己看算法导论吧

我再看到

这条公式的时候很困惑,然后自己手算了他给的第一个例子才知道这是正确的.

3.问题

具体的问题已经在代码注释中讲解完毕

4.进阶

输出只是I一个普通的递归而已

package collection;
​
public class printOptimalParens {
    public static void matrixChainOrder(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 i = 1; i <= n; i++) {
            m[i][i] = 0;
        }
        for (int len = 2; len <= n; len++) {
            for (int i = 1; i <= n - len + 1; i++) {
                int j = i + len - 1;
                m[i][j] = Integer.MAX_VALUE;
                for (int k = i; k <= j - 1; k++) {
                    int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                    if (q < m[i][j]) {
                        m[i][j] = q;
                        s[i][j] = k;
                    }
                }
            }
        }
        System.out.println("Optimal Parenthesization:");
        printOptimalParens(s, 1, n);
    }
​
    public static void printOptimalParens(int[][] s, int i, int j) {
        if (i == j) {
            System.out.print("A" + i);
        } else {
            System.out.print("(");
            printOptimalParens(s, i, s[i][j]);
            printOptimalParens(s, s[i][j] + 1, j);
            System.out.print(")");
        }
    }
​
    public static void main(String[] args) {
        int[] p = {30, 35, 15, 5, 10, 20, 25};
        matrixChainOrder(p);
    }
}
​
​
((A1(A2A3))((A4A5)A6))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE/异常

博客制作不易&#xff0c;欢迎各位点赞&#x1f44d;收藏⭐关注 前言 在使用Java编写代码时&#xff0c;我们难免会遇到数组越界、运行超时、栈溢出等异常问题。所以如果我们熟练掌握异常的定义和使用&#xff0c;这对我们学习Java有很大的帮助。 一、异常的定义 程序执行过程…

图书馆管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87682509 更多系统资源库…

计算机视觉的热门研究方向与发展趋势

计算机视觉产业链 工业界&#xff1a;对学术研究提出需求 最火的两个概念&#xff1a;自动驾驶和元宇宙 相关热点研究方向&#xff1a; &#xff08;1&#xff09;建图技术&#xff1a;三维重建技术&#xff0c;包括SLAM、定位、建图、更新等技术&#xff1b;&#xff08;2&…

学习机器人SLAM导航核心技术(一)

本章节&#xff0c;我们将学习基于SLAM导航的机器人技术。 学习资料主要参照张虎的《机器人SLAM导航核心技术与实战》和高翔的《视觉SLAM十四讲》。 以机器人SLAM导航核心技术与实战作为学习的技术路线。在此基础上增加自己学习到的内容。 第1章&#xff1a;ROS入门必备知识 …

Git介绍与相关操作

git简介 git是用于版本控制的软件&#xff0c;保留历史记录&#xff0c;便于回溯 GitHub中文官方文档 访问GitHub GitHub520 无法访问GitHub太常见了&#xff0c;主要方法就是查ip&#xff0c;改本地host文件。 GitHub520本质也是修改hosts来实现&#xff0c;但是无需手动查…

Pycharm Debug调试技巧

Pycharm Debug调试 Python中的Bug是指程序在执行过程中出现错误的情况。这些错误可能会导致程序崩溃、输出意外的结果或者根本不运行。 常见的Python Bug包括&#xff1a; 语法错误&#xff1a;例如拼写错误、缺少冒号、使用了错误的缩进等等。逻辑错误&#xff1a;程序可以…

草图大师su通过照片建模建筑 零插件sketchup

打开sketchup&#xff0c;相机-匹配新照片。照片的要求&#xff1a; “匹配照片”最适合主要由直角组成的结构。您肯定至少需要一个直角才能使用匹配照片。使用从角落以大约 45 度角拍摄的照片。上图来自谷歌街景图是以 45 度角拍摄的图像示例。如果您正在拍照&#xff0c;则可…

模糊数学求传递闭包(C语言)

一、问题描述 我们在模糊数学中利用传递闭包法进行聚类分析的时候&#xff0c;需要求模糊相似矩阵的传递闭包&#xff0c;对于阶数比较高的矩阵&#xff0c;手工计算太过于繁琐&#xff0c;我们可以借助程序实现。 我们先来看一下模糊矩阵的合成规则&#xff1a; 设为有限论域…

ChatGPT能取代传统伪原创工具吗?

文章伪原创工具是一种计算机辅助写作工具&#xff0c;通过算法和技术实现对原有文章内容进行修改和改写&#xff0c;生成新的、看起来不同于原文的文章&#xff0c;以达到避免抄袭和提高原创性的目的。今天我们来聊聊传统伪原创工具和使用ChatGPT进行文章改写的优缺点。 一、传…

【状态估计】电力系统状态估计的虚假数据注入攻击建模与对策(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C++ Linux Web Server 面试基础篇-操作系统(一、Linux基础)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

SpringBoot访问静态资源和jar外部静态资源,部署前端打包后的vue项目放入静态资源里

记录一下使用SpringBoot访问静态资源和SpringBoot打包之后的jar外部静态资源&#xff0c;在开发的时候&#xff0c;一般选择前后端分离的方式&#xff0c;前端使用vue 后端使用SpringBoot&#xff0c;通常情况下&#xff0c;部署都是前端通过http去请求后端资源&#xff0c;涉及…

CVE-2021-27905 Apache Solr SSRF漏洞

预备知识 1. 漏洞信息 漏洞编号&#xff1a;CVE-2021-27905 漏洞名称&#xff1a;Apache Solr SSRF漏洞 漏洞描述&#xff1a;Apache Solr是一个开源的搜索服务&#xff0c;使用Java编写、运行在Servlet容器的一个独立的全文搜索服务器&#xff0c;是Apache Lucene项目的开源…

在Claude穿越千年,问了孔子人生问题

&#x1f4d5;如果大家还不知道Claude的话&#xff0c;可以先了解下&#xff0c;它是chatgpt最大的竞争对手。他有很多的知识&#xff0c;能做的事情也非常的多。 今天我们就让他用孔子的思想来跟我们对话&#xff0c;看看他会怎么回答我们的人生问题。 我们先问问他&#xf…

组播协议的RP

某组播网络示意图如图,其中MCS1是组播地址(G1)的组播源,PC1和PC2是组G1的接收者。 1.上述组播网络中,端口1、2、3需要运行哪些协议,为什么需要运行这些协议?(仅填必配的组播协议)详细写出具体原因 结合上述拓扑,考虑到存在RP场景,因此运行组播路由协议为PIM-SM协议,…

『pyqt5 从0基础开始项目实战』07. 次数清零与多行数据删除(保姆级图文)

目录 导包和框架代码 次数清零按钮添加绑定事件实现数据清零 数据删除按钮添加绑定事件实现删除功能完整代码总结 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 导包和框架代码 请…

GEE:Gmeans图像分割

G-means是一种聚类算法,它是基于K-means算法的改进版本。K-means算法的一个主要缺点是需要事先指定聚类的数量,而G-means算法则可以自动确定聚类的数量。 G-means算法使用了类似于K-means的迭代过程,但在每次迭代时,它会检查每个聚类是否可以继续细分为两个子聚类。这个检…

保护你的数字资产:网络安全的重要性和应对策略

网络安全已经成为现代企业和组织的重要问题。在数字化的时代&#xff0c;网络攻击和安全威胁的规模和复杂性不断增加&#xff0c;因此保护数字资产变得越来越重要。而Log360作为一款全面的网络安全解决方案&#xff0c;可以帮助企业识别、分析和应对网络安全威胁&#xff0c;从…

【PyTorch】第六节:乳腺癌的预测(二分类问题)

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

【SCI电气】考虑不同充电需求的电动汽车有序充电调度方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…