矩阵连乘(动态规划)

简介: 题目描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

题目描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如:

  A1={30x35} ; A2={35x15} ;A3={15x5} ;A4={5x10} ;A5={10x20} ;A6={20x25} ;

最后的结果为:((A1(A2A3))((A4A5)A6)) 最小的乘次为15125。

思路:动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算(即先从最小的开始计算)。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。

这里写图片描述


public class Test {
    private static final int  count = 6;
    /**
     * 存储的是i+1到j+1的最小乘次,因为是从0开始
     */
    static int[][] min_part = new int[count][count];

    /**
     * 计算矩阵最小乘次数
     * @param p 保存矩阵行列的数组
     * @param n 矩阵的个数
     * @param min_part 保存最小乘次数
     * @return
     */
    public static int function(int[] p, int n, int[][]min_part) {
        int j = 0;

        for (int i = 0; i < n; i++) {
            min_part[i][i] = 0;
        }

        //r为连乘矩阵的个数
        for (int r = 2; r <= n; r++) {
            //i表示连乘矩阵的第一个,从连乘矩阵个数为2开始计算 需要算n-r个
            for (int i = 0; i <= n - r; i++) {
                //j表示连乘矩阵中的最后一个
                j = i + r - 1;
                min_part[i][j] = Integer.MAX_VALUE;

                for (int k = i; k <= j-1; k++) {
                    //在第一个与最后一个之间寻找最合适的断开点
                    int tmp = min_part[i][k] + min_part[k+1][j] + p[i]*p[k+1]*p[j+1];

                    if (tmp < min_part[i][j]) {
                        min_part[i][j] = tmp;
                    }
                }
            }
        }
        return min_part[0][n-1];
    }

    public static void main(String[] args) {
        int[] p = new int[count+1];
        p[0] = 30;
        p[1] = 35;
        p[2] = 15;
        p[3] = 5;
        p[4] = 10;
        p[5] = 20;
        p[6] = 25;

        int ans = function(p,count,min_part);
        System.out.println(ans);
    }
}

从2个矩阵开始计算: m[0][1] m[1][2] m[2][3] m[3][4] m[4][5] //m[0][1]表示第一个矩阵与第二个矩阵的最小乘次数、

以此类推 3个矩阵计算m[0][2] m[1][3] m[2][4] m[3][5]
。。。
一直到6个矩阵计算 m[0][5]即为结果

每次计算均取到上一矩阵计算保存的结果

目录
相关文章
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之当需要将数据从ODPS同步到RDS,且ODPS表是二级分区表时,如何同步所有二级分区的数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
275 7
|
安全 API 数据安全/隐私保护
PyMuPDF 1.24.4 中文文档(一)(3)
PyMuPDF 1.24.4 中文文档(一)
532 2
|
存储 机器学习/深度学习 安全
阿里云服务器计算型c8i和通用型g8i实例性能、收费标准和适用场景参考
阿里云不断推出高性能云服务器实例以满足不同用户的需求。其中,计算型c8i与通用型g8i实例凭借卓越的性能和灵活的配置,成为企业级用户的热门选择。计算型c8i和通用型g8i实例采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固,单台实例最高支持100万IOPS,CPU采用Intel®Xeon®Emerald Rapids或者Intel®Xeon®Sapphire Rapids,主频不低于2.7 GHz,全核睿频3.2GHz。本文将深入探讨这两款实例的性能特点、最新收费标准以及适用场景和活动价格情况,以供大家了解和选择。
235 10
阿里云服务器计算型c8i和通用型g8i实例性能、收费标准和适用场景参考
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
154 2
为啥会这样啊?
通义灵码,加法计算不准确
|
Java 开发者
深入理解Java并发编程:从基础到高级
【5月更文挑战第13天】本文将深入探讨Java并发编程的各个方面,从基础知识到高级概念。我们将首先介绍线程的基本概念,然后深入讨论Java中的多线程编程,包括线程的创建和控制,以及线程间的通信。接下来,我们将探讨并发编程中的关键问题,如同步、死锁和资源竞争,并展示如何使用Java的内置工具来解决这些问题。最后,我们将讨论更高级的并发编程主题,如Fork/Join框架、并发集合和并行流。无论你是Java新手还是有经验的开发者,这篇文章都将帮助你更好地理解和掌握Java并发编程。
|
关系型数据库 Linux 网络安全
Linux | 安装openGauss数据库【极简版】
Linux | 安装openGauss数据库【极简版】
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器免费用!最高4核16G配置,最长3个月,这波羊毛可以薅
阿里云服务器到底好不好用,必须试试才知道!为此,阿里云特意推出了云产品试用活动,包括云服务器在内的132款云产品提供免费试用,即日起,凡注册阿里云且通过实名认证的新用户,个人用户提供每月750小时的免费试用时长,企业用户最长可免费试用3个月云服务器,免费云服务器最高配置为4核16G1M配置云服务器。
阿里云服务器免费用!最高4核16G配置,最长3个月,这波羊毛可以薅
|
存储 缓存 安全
Java并发指南11:解读 Java 阻塞队列 BlockingQueue
解读 Java 并发队列 BlockingQueue 转自:https://javadoop.com/post/java-concurrent-queue 最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括我自己在仔仔细细看源码之前,也有许多的不解,甚至有些地方我一直都没有理解到位。
|
存储 大数据 Python
Python中的迭代器与生成器:提升代码效率的利器
【2月更文挑战第1天】在Python编程中,迭代器和生成器是两个强大的工具,能够极大地提升代码的效率和可读性。本文将深入探讨Python中迭代器和生成器的定义、用法以及优势,并通过示例代码展示它们在实际项目中的应用,帮助读者更好地理解和运用这些技术。
129 1