动态规划-3.1.3矩阵连乘问题之备忘录方法(自顶向下)

2024-01-10 04:32

本文主要是介绍动态规划-3.1.3矩阵连乘问题之备忘录方法(自顶向下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

备忘录方法为每个子问题建立一个记录项,初始化时,该记录项存入一个特殊值,表示该子问题尚未解决。在求解过程中,对每个待求子问题,首先查看其相应的记录项。有变化则不算,无则算。

代码如下:

public class test3_1_3 {static int[] p = {30,35,15,5,10,20,25};static int n = p.length;static int[][] m = new int[n][n];static int[][] s = new int[n][n];public static int memoizedMatrixChain(int n){  //备忘录方法for(int i=1;i<n;i++)for(int j=1;j<n;j++)m[i][j] = 0;  //初始化未解决的问题最优值都标记为0return lookupChain(1,n-1);}public static int lookupChain(int i,int j){if(m[i][j]>0) return m[i][j]; //若m[i][j]>0,则此问题已经解决过,跳过if(i==j) return 0;m[i][j] = lookupChain(i+1,j)+p[i-1]*p[i]*p[j];s[i][j] = i;for(int k=i+1;k<j;k++){int t = lookupChain(i,k)+lookupChain(k+1,j)+p[i-1]*p[k]*p[j];if(t<m[i][j]){m[i][j] = t;s[i][j] = k;}}return m[i][j];}public static void traceback(int[][] s,int i,int j){if(i==j) return;traceback(s,i,s[i][j]);traceback(s,s[i][j]+1,j);System.out.println("(A"+i+"。。。"+"A"+s[i][j]+")(A"+(s[i][j]+1)+"。。。"+"A"+j+")");}public static void main(String[] args) {int memoized = memoizedMatrixChain(n);System.out.println("矩阵连乘最优值为:"+memoized);traceback(s,1,n-1);}
}

运行结果如下:

矩阵连乘最优值为:15125
(A2。。。A2)(A3。。。A3)
(A1。。。A1)(A2。。。A3)
(A4。。。A4)(A5。。。A5)
(A4。。。A5)(A6。。。A6)
(A1。。。A3)(A4。。。A6)

总结:与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的。因此,备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

算法时间复杂度:O(n^3)。

这篇关于动态规划-3.1.3矩阵连乘问题之备忘录方法(自顶向下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589551

相关文章

Java中的getBytes()方法使用详解

《Java中的getBytes()方法使用详解》:本文主要介绍Java中getBytes()方法使用的相关资料,getBytes()方法有多个重载形式,可以根据需要指定字符集来进行转换,文中通过代... 目录前言一、常见重载形式二、示例代码三、getBytes(Charset charset)和getByt

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

nginx负载均衡及详细配置方法

《nginx负载均衡及详细配置方法》Nginx作为一种高效的Web服务器和反向代理服务器,广泛应用于网站的负载均衡中,:本文主要介绍nginx负载均衡及详细配置,需要的朋友可以参考下... 目录一、 nginx负载均衡策略1.1 基本负载均衡策略1.2 第三方策略1.3 策略对比二、 nginx配置2.1

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分