当前位置: 首页 > news >正文

15.2 矩阵链乘法

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,因为一个矩阵的乘积为0for (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))

相关文章:

15.2 矩阵链乘法

1.代码 public class MatrixChainMultiplication {public static void main(String[] args) { // 在该代码中&#xff0c;我们首先创建了两个n * n的矩阵m和s&#xff0c;分别用于记录最优值和分割点。 其中m 矩阵 通过i j 来显示在i到j的矩阵链中最优解 // // …...

向隐形冠军学习:聚焦人效,用时间管理提效益

注&#xff1a; 本文来源于盖雅工场联合创始人兼CEO 章新波 在2023狮山论坛“ 向隐形冠军学习&#xff1a; 聚焦人效&#xff0c;用时间管理提效益 ”的主题分享。 文&#xff5c;章新波 整理 &#xff5c;盖雅学苑 在人力资源行业以及各大企业&#xff0c;「人效」这个词…...

Protocol Buffers Go Generated Code Guide

Protocol Buffers Go 代码生成指南 本主题准确描述了协议缓冲区编译器为任何给定的协议定义生成的Go代码。 编译器调用 协议缓冲区编译器需要一个插件来生成Go 代码。使用Go 1.16或更高版本安装&#xff0c;方法是运行&#xff1a; go install google.golang.org/protobuf/…...

Python VTK STL 映射三维模型表面距离

目录 前言&#xff1a; 效果&#xff1a; 实现步骤&#xff1a; Code: 前言&#xff1a; 本文介绍了Python VTK映射三维模型表面距离&#xff0c;通过如何使用VTK计算两个三维模型(stl)的表面距离&#xff0c;并将其距离值以颜色映射到模型&#xff0c;可用于对比 两相模型…...

C# 异常处理机制和常见的异常类型

在 C# 中&#xff0c;异常处理是一个非常重要的概念&#xff0c;它可以让我们在程序发生错误时进行有效的处理&#xff0c;使程序具备更好的鲁棒性。C# 异常处理机制基于 try-catch-finally 语句块&#xff0c;其基本用法如下&#xff1a; try {// 可能会抛出异常的代码 } cat…...

【0187】客户端身份验证配置文件视图之pg_hba_file_rules

文章目录 1. 客户端身份验证配置文件视图2. 视图效果相关阅读: 【0179】配置PostgreSQL以允许远程连接 【0180】PG内核通过pg_hba.conf完成客户端认证(1) 【0181】PG内核通过pg_hba.conf完成客户端认证(2)...

模糊层次分析法(FAHP)Python实现

文章目录 理论基础三角模糊数概念参考 Python源码测试 理论基础 \quad 模糊层次分析法&#xff08; F A H P FAHP FAHP&#xff09;将模糊理论&#xff08; F u z z y S e t Fuzzy Set FuzzySet&#xff09;嵌入到基本层次分析法&#xff08; A H P AHP AHP&#xff09;中。 A …...

gdb切换窗口焦点

为了辅助调试&#xff0c;一般会使用layout src&#xff0c;调起TUI显示代码&#xff1a; 然而这种情况下我们写命令很不方便&#xff0c;无法方便地使用上一条命令、退格等。 按动上下左右方向键盘只会移动代码框&#xff0c;然而在伪终端下&#xff0c;可以用鼠标滚轮来上下…...

【Spring Security】 入门实战

文章目录 一、基本概念二、Spring Security第一个程序三、Spring Security没有生效四、修改默认账号密码&#xff08;appliction.yml&#xff09;五、修改默认账号密码&#xff08;配置类&#xff09;六、Spring Security的三个configure方法七、Spring Security的三种身份的验…...

SpringBoot的Interceptor拦截器的简介和实际使用

拦截器&#xff08;Interceptor&#xff09; 概念&#xff1a;是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。Spring框架中提供的&#xff0c;用来动态拦截控制器方法的执行。 作用&#xff1a;拦截请求&#xff0c;在指定的方法调用前后&#xff0c;根据业务需要执行…...

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。 本文探讨了 Python 中的五个高级主题&#xff0c;它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的…...

Nginx简介

Nginx是什么&#xff1f;可以做什么事情&#xff1f; Nginx是高性能的HTTP和反向代理的web服务器&#xff0c;处理高并发的能力十分强大&#xff0c;能经受高负载的考研&#xff0c;有报告表明能能支持高达50000个并发连接数。 特点 占有内存少&#xff1a;一万个长连接&…...

十五分钟带你学会 Electron

文章目录 什么是 Electron为什么要选择 Electron安装 Electron桌面CSDN实战Electron 基础配置Electron 进程主进程渲染进程主进程与渲染进程的区别主进程与渲染进程的通信 Electron 跨平台问题Electron 部署打包应用程序发布应用程序 Electron 跨端原理总结 什么是 Electron E…...

设计模式-结构型模式之桥接模式

2. 桥接模式 2.1. 模式动机 设想如果要绘制矩形、圆形、椭圆、正方形&#xff0c;我们至少需要4个形状类&#xff0c;但是如果绘制的图形需要具有不同的颜色&#xff0c;如红色、绿色、蓝色等&#xff0c;此时至少有如下两种设计方案&#xff1a; 第一种设计方案是为每一种形状…...

软件测试工程师为什么要写测试用例?

软件测试工程师为什么要写测试用例&#xff1f;相信从事软件测试行业的从业者来讲&#xff0c;测试用例并不陌生。因为测试用例不仅仅是一组简单的文档&#xff0c;它包含前提条件、输入、执行条件和预期结果等等重要内容&#xff0c;并且能够完成一定的测试目的和需求。下面本…...

【DAY40】VUE练习

DOS命令&#xff1a; DOS&#xff08;Disk Operating System&#xff09;是一种操作系统&#xff0c;它使用命令行界面&#xff08;Command Prompt&#xff09;进行交互。在 DOS 中&#xff0c;有一些常用的命令&#xff0c;可以用来定位目录、创建、删除、拷贝文件和目录&…...

实模式的寄存器

实模式的寄存器有8个通用寄存器&#xff0c;分别为AX、BX、CX、DX、SI、DI、BP和SP。通用的意思就是它们之中的大部分可以根据需要用于多种目的。 AX: accumulator&#xff0c;累加寄存器 BX: base&#xff0c;基址寄存器 CX: count&#xff0c;计数寄存器 SI: Source Index&am…...

【UE 控件蓝图】通过键盘选中要点击的按钮 通过Enter键点击

上一篇【UE 控件蓝图】菜单及功能实现博客已经完成了菜单的制作&#xff0c;但是我们只能通过鼠标来点击菜单选项&#xff0c;本篇博客实现的是能够通过键盘的上下键来选中按钮&#xff0c;然后按下“Enter”键来实现点击按钮的效果。 效果 可以看到并没有移动鼠标也可以通过…...

SSR在天猫优品大促会场的探索实践

BBC 发现其网站加载时间每增加一秒&#xff0c;用户便会流失 10%。为提高页面的秒开率&#xff0c;我们不断探索着优化策略&#xff0c;仅仅在浏览器领域下的优化已经满足不了我们的极致要求&#xff0c;开始往服务端方向不断探索。本文将讨论业务接入SSR的几个问题&#xff1a…...

WPF教程(一)---创建一个WPF程序基础知识

1.前言&#xff1a; 这篇主要讲WPF的开发基础&#xff0c;介绍了如何使用Visual Studio 2019创建一个WPF应用程序。 首先说一下学习WPF的基础知识&#xff1a; 1) 要会一门.NET所支持的编程语言--例如C#。 2) 会一点“标准通用标记语言”&#xff1a;WPF窗体程序使用的XAML语…...

开发者专属提示词库:提升AI协作效率的实战指南

1. 项目概述&#xff1a;一个为开发者量身定制的提示词宝库如果你是一名开发者&#xff0c;无论是前端、后端、运维还是算法工程师&#xff0c;我相信你都或多或少地接触过像 ChatGPT 这类大型语言模型。它们能写代码、解 Bug、解释概念&#xff0c;甚至帮你设计架构。但很多时…...

打造便携式Kali Linux安全评估工具:OpenClaw USB定制全攻略

1. 项目概述&#xff1a;一个便携式安全评估工具的诞生 在安全研究、渗透测试或者应急响应的现场&#xff0c;你经常会遇到一个经典困境&#xff1a;目标环境可能是一台物理隔离的机器&#xff0c;或者是一台你无法安装任何软件的“干净”主机。你需要一个功能强大、即插即用的…...

跨越平台限制:如何用WorkshopDL免费获取Steam创意工坊模组

跨越平台限制&#xff1a;如何用WorkshopDL免费获取Steam创意工坊模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为Epic Games或GOG平台无法访问Steam创意工坊而烦恼吗…...

Linuxbonding链路异常定位实战

Linuxbonding链路异常定位实战这是一篇面向中级 Linux 使用者的技术文章&#xff0c;主题聚焦在bonding链路&#xff0c;重点讨论链路聚合、冗余切换和接口状态。在真实生产环境中&#xff0c;bonding链路相关问题往往不会以单一错误形式出现&#xff0c;而是混杂在日志、权限、…...

开源银行API模拟器Bankr Buddy:金融科技开发的本地化测试解决方案

1. 项目概述&#xff1a;一个为开发者准备的银行API模拟器如果你正在开发一个需要与银行账户数据打交道的应用&#xff0c;无论是个人财务管理工具、预算分析软件&#xff0c;还是企业级的财务聚合服务&#xff0c;你肯定遇到过同一个难题&#xff1a;如何在不触碰真实用户敏感…...

Arm CoreLink PCK-600电源管理架构与寄存器编程详解

1. Arm CoreLink PCK-600电源控制架构解析在嵌入式系统设计中&#xff0c;电源管理单元&#xff08;PMU&#xff09;是实现高效能耗控制的核心组件。Arm CoreLink PCK-600作为业界领先的电源控制解决方案&#xff0c;其架构设计体现了现代SoC电源管理的先进理念。PCK-600系列采…...

Apache Burr:用状态机模式构建Python流式应用

1. 项目概述&#xff1a;一个用于构建流式应用的Python框架最近在折腾一些实时数据处理和模型推理的项目&#xff0c;从简单的日志分析到复杂的在线推荐&#xff0c;总感觉现有的工具链要么太重&#xff0c;要么太散。想要一个既能处理流式数据&#xff0c;又能轻松集成机器学习…...

ElevenLabs克隆成功率从31%飙升至96.7%:基于LPC共振峰校准+Prosody Transfer双引擎微调法(实测数据包已脱敏上传)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs语音克隆方法概览 ElevenLabs 提供了高保真、低延迟的语音克隆能力&#xff0c;其核心依赖于少量高质量语音样本&#xff08;通常 1–3 分钟&#xff09;与上下文感知的零样本/少样本微调技术…...

嵌入式事件驱动框架Curtroller:模块化设计提升开发效率

1. 项目概述与核心价值最近在嵌入式开发社区里&#xff0c;一个名为“Curtroller”的项目引起了我的注意。这个项目由开发者KenWuqianghao在GitHub上开源&#xff0c;名字本身就是一个巧妙的组合——“Curt”&#xff08;可能是“Current”电流的缩写或“Control”控制的变体&a…...

ESP32接入ChatGPT API:构建本地化AIoT智能交互终端

1. 项目概述&#xff1a;当ESP32遇见ChatGPT&#xff0c;开启本地化智能交互新玩法最近在捣鼓ESP32开发板&#xff0c;总想着给它加点“智能”的料。传统的物联网项目&#xff0c;比如温湿度监测、远程控制开关&#xff0c;虽然实用&#xff0c;但总觉得少了点“灵魂”。直到我…...