Java动态规划---矩阵链相乘的最小计算代价
参考书籍:算法导论第三版。
采用自底向上的递归模式来求解。
* 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示。
* 主要的计算思想是递归,而且是带备忘录的递归,辅助作用,存放计算结果。
问题描述:当计算一个矩阵链的时候,计算矩阵的顺序直接影响最后的计算性能。
举一个例子来说明问题:计算矩阵链 A1A2A3A4A5A6标量乘法的总次数?
手动定义矩阵链大小,用一个序列p表示[30 35 15 5 10 20 25],满足矩阵的乘法尊则。
A1:30X35
A2:35X15
A3:15X5
A4:5X10
A5:10x20
A6:20x25
直接上代码:(范围是int型的),可以更改为long型的。
package com.quan.dynamic_programming;/*** @author quan* 动态规划在矩阵链相乘的应用,目的求出最小的计算代价。* 主要的计算思想是递归,而且是带备忘录的递归,辅助作用。存放计算结果。*/
public class MatrixLinkedMultiply {
/*
手动定义矩阵链大小,用一个序列p表示[30 35 15 5 10 20 25]
A1:30X35
A2:35X15
A3:15X5
A4:5X10
A5:10x20
A6:20x25*/public static void main(String[] args){int[] p = {30, 35, 15, 5, 10, 20, 25};int n = p.length -1;//存放计算代价int[][] m = new int[n][n];//存放分割标号k的值int[][] s = new int[n-1][n];//链长为1的最小计算代价为0.for(int i = 0; i < n; i++){m[i][i] = 0;}//链长从2到n遍历for(int L = 2; L <= n; L++){//遍历的范围,逐渐缩小范围,从第一个开始。for(int i = 0; i < n - L + 1; i++){//每次区间加1,遵从自底向上的递归形式求解。int j = i + L -1;//初始化m[i,j]的值为无限大。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]*p[k+1]*p[j+1];if(q < m[i][j]){//保存序列代价的结果m[i][j] = q;//保存分割点k的值s[i][j] = k;}}}}//输出计算代价的矩阵m,其最终结果是矩阵m[0][m.length-1]System.out.println("该矩阵链的最小计算次数:"+m[0][n-1]);for(int i=0; i <m.length; i++){for(int j=0; j <m.length; j++){System.out.print(m[i][j] +" ");}System.out.println();}//构造最优解MatrixLinkedMultiply.printOptimalPatterns(s,0,n-1);System.out.println();for(int i=0; i <s.length; i++){for(int j=0; j <s[i].length; j++){System.out.print(s[i][j] +" ");}System.out.println();}}static void printOptimalPatterns(int[][]s,int i, int j){if(i==j)System.out.print("A"+(i+1));//A从1开始,所以记得加1else{System.out.print("(");printOptimalPatterns(s,i,s[i][j]);printOptimalPatterns(s,s[i][j]+1,j);System.out.print(")");}}
}
运行结果如下:
m矩阵
0 15750 7875 9375 11875 15125
0 0 2625 4375 7125 10500
0 0 0 750 2500 5375
0 0 0 0 1000 3500
0 0 0 0 0 5000
0 0 0 0 0 0
该矩阵链的最小计算次数:15125
s矩阵:最优解的所有信息,k值为0,1,2,3,4. i值为0,1,2,3,4,5.分为两段A0..k和Ak+1..5,也是用到了递归求解。
0 0 0 2 2 2
0 0 1 2 2 2
0 0 0 2 2 2
0 0 0 0 3 4
0 0 0 0 0 4
((A1(A2A3))((A4A5)A6))
Java动态规划---矩阵链相乘的最小计算代价相关推荐
- 动态规划——矩阵链相乘
如果看过我上一篇文章(动态规划--最长公共子序列)的同学,相信已经对动态规划的思想有了一定的了解和认识,即把之前求解得出的子问题存储起来,以便后续求解大问题直接使用. 本章要讲解的问题是矩阵链相乘.因 ...
- 以空间换时间——动态规划算法及其应用:矩阵链相乘
动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...
- 【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)
矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<=100) n+1个数,表示矩阵(<=100) Output 最小的 ...
- 矩阵链相乘(动态规划法)
矩阵链乘法是耳熟能详的问题了,有很多矩阵,排列成矩阵链,矩阵链的要求是相邻的两个是可以相乘的,可以相乘是有条件的,两个矩阵能够相乘的条件就是行.列之间是有关系的,两个矩阵如果能够相乘,就是前面矩阵的列 ...
- 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...
矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...
- 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法
一:题目: 输入样例: 在这里给出一组输入.例如: 5 30 35 15 5 10 20 输出样例: 在这里给出相应的输出.例如: 11875 二:基本解析 1.基本的动态规划知识: 1):求解过程是 ...
- java求矩阵的逆矩阵_Java逆矩阵计算
我正在尝试用Java计算逆矩阵. 我正在遵循伴随方法(首先计算伴随矩阵,然后转置这个矩阵,最后,将它乘以行列式值的倒数). 当矩阵不太大时,它可以工作.我已经检查过,对于尺寸为12×12的矩阵,可以快 ...
- 【动态规划】矩阵链乘法
矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 为了计算表 ...
- 动态规划典型题之——矩阵链乘法
动态规划是算法分析与设计中一种重要的算法.其核心思想是将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法. 文章目录 一.矩阵链相乘问题 二.求解 1.构建备忘录 2.回溯 结果展示 一.矩 ...
最新文章
- IPK僵尸网络 看看其传播手法
- vue的多选框存储值操作
- boost::graph模块实现一个只读隐式加权图的简单示例的测试程序
- (计算机组成原理)第二章数据的表示和运算-第二节5:定点数乘法运算(原码/补码一位乘法)
- 关于未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值的解决方法...
- 【华为云技术分享】物体检测yolo3算法 学习笔记2
- hadoop hbase java_Hadoop、Hbase伪分布式安装
- 随想录(smp的一些注意事项)
- 《作业指导书》的发布管理问题与解决办法
- php complex,PHP復雜的基於角色的訪問控制列表
- Linux环境下gcc静态编译/usr/bin/ld: cannot find -lc错误原因及解决方法。
- 关于使用mac聚焦搜索无法搜索软件的情况
- nginx trac mysql svn_linux下nginx+svn
- pycharm设置python环境_pycharm怎么配置python环境
- proteus8.6 示波器弹不出来?
- android控件Recy,Android RecyclerView控件的使用
- Cint() , int(),round() , fix() 的区别与联系
- 更好的 java 重试框架 sisyphus 入门简介
- java实现缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等
- 在虚拟机关机时,提示Ubuntu-Unattended upgrade in progress during shutdown, please don‘t turn off
热门文章
- ArrayList 类方法toArray的一点疑惑
- SQL语句的一些重要操作
- mysql多数据库并发控制_什么是数据库并发控制?数据库并发控制的主要方法是?...
- 【编译原理笔记09】语法制导翻译:语法制导翻译方案,在非递归的预测分析过程中进行翻译
- python print sep,Python3.x语句print(1,2,3,sep=’:’)的输出结果为()。
- QueryPerformanceFrequency使用方法--Windows高精度定时计数
- oracle sql去差集,Oracle 两个逗号分割的字符串,获取交集、差集的sql实现过程解析...
- awk命令的使用案列
- 解决datagridview 横向的scrollbar不显示
- linux瘦身软件下载,瘦身相机APP全新安卓版下载-瘦身相机APPV1.3.0-Linux公社