参考书籍:算法导论第三版。

采用自底向上的递归模式来求解。

* 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示。

* 主要的计算思想是递归,而且是带备忘录的递归,辅助作用,存放计算结果。

问题描述:当计算一个矩阵链的时候,计算矩阵的顺序直接影响最后的计算性能。

举一个例子来说明问题:计算矩阵链 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动态规划---矩阵链相乘的最小计算代价相关推荐

  1. 动态规划——矩阵链相乘

    如果看过我上一篇文章(动态规划--最长公共子序列)的同学,相信已经对动态规划的思想有了一定的了解和认识,即把之前求解得出的子问题存储起来,以便后续求解大问题直接使用. 本章要讲解的问题是矩阵链相乘.因 ...

  2. 以空间换时间——动态规划算法及其应用:矩阵链相乘

    动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...

  3. 【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

    矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<=100) n+1个数,表示矩阵(<=100) Output 最小的 ...

  4. 矩阵链相乘(动态规划法)

    矩阵链乘法是耳熟能详的问题了,有很多矩阵,排列成矩阵链,矩阵链的要求是相邻的两个是可以相乘的,可以相乘是有条件的,两个矩阵能够相乘的条件就是行.列之间是有关系的,两个矩阵如果能够相乘,就是前面矩阵的列 ...

  5. 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

    矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...

  6. 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法

    一:题目: 输入样例: 在这里给出一组输入.例如: 5 30 35 15 5 10 20 输出样例: 在这里给出相应的输出.例如: 11875 二:基本解析 1.基本的动态规划知识: 1):求解过程是 ...

  7. java求矩阵的逆矩阵_Java逆矩阵计算

    我正在尝试用Java计算逆矩阵. 我正在遵循伴随方法(首先计算伴随矩阵,然后转置这个矩阵,最后,将它乘以行列式值的倒数). 当矩阵不太大时,它可以工作.我已经检查过,对于尺寸为12×12的矩阵,可以快 ...

  8. 【动态规划】矩阵链乘法

    矩阵链乘法    求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积  A1A2...An    为了计算表 ...

  9. 动态规划典型题之——矩阵链乘法

    动态规划是算法分析与设计中一种重要的算法.其核心思想是将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法. 文章目录 一.矩阵链相乘问题 二.求解 1.构建备忘录 2.回溯 结果展示 一.矩 ...

最新文章

  1. IPK僵尸网络 看看其传播手法
  2. vue的多选框存储值操作
  3. boost::graph模块实现一个只读隐式加权图的简单示例的测试程序
  4. (计算机组成原理)第二章数据的表示和运算-第二节5:定点数乘法运算(原码/补码一位乘法)
  5. 关于未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值的解决方法...
  6. 【华为云技术分享】物体检测yolo3算法 学习笔记2
  7. hadoop hbase java_Hadoop、Hbase伪分布式安装
  8. 随想录(smp的一些注意事项)
  9. 《作业指导书》的发布管理问题与解决办法
  10. php complex,PHP復雜的基於角色的訪問控制列表
  11. Linux环境下gcc静态编译/usr/bin/ld: cannot find -lc错误原因及解决方法。
  12. 关于使用mac聚焦搜索无法搜索软件的情况
  13. nginx trac mysql svn_linux下nginx+svn
  14. pycharm设置python环境_pycharm怎么配置python环境
  15. proteus8.6 示波器弹不出来?
  16. android控件Recy,Android RecyclerView控件的使用
  17. Cint() , int(),round() , fix() 的区别与联系
  18. 更好的 java 重试框架 sisyphus 入门简介
  19. java实现缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等
  20. 在虚拟机关机时,提示Ubuntu-Unattended upgrade in progress during shutdown, please don‘t turn off

热门文章

  1. ArrayList 类方法toArray的一点疑惑
  2. SQL语句的一些重要操作
  3. mysql多数据库并发控制_什么是数据库并发控制?数据库并发控制的主要方法是?...
  4. 【编译原理笔记09】语法制导翻译:语法制导翻译方案,在非递归的预测分析过程中进行翻译
  5. python print sep,Python3.x语句print(1,2,3,sep=’:’)的输出结果为()。
  6. QueryPerformanceFrequency使用方法--Windows高精度定时计数
  7. oracle sql去差集,Oracle 两个逗号分割的字符串,获取交集、差集的sql实现过程解析...
  8. awk命令的使用案列
  9. 解决datagridview 横向的scrollbar不显示
  10. linux瘦身软件下载,瘦身相机APP全新安卓版下载-瘦身相机APPV1.3.0-Linux公社