漫画:什么是动态规划?(整合版)

转载自 玻璃猫 程序员小灰

————————————

题目:

有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。

比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可以简写成 1,1,1,1,1,1,1,1,1,1。

再比如,每次走2级台阶,一共走5步,这是另一种走法。我们可以简写成 2,2,2,2,2。

当然,除此之外,还有很多很多种走法。

————————————

第一种情况:

第二种情况:

把思路画出来,就是这样子:

F(1) = 1;

F(2) = 2;

F(n) = F(n-1)+F(n-2)(n>=3)

方法一:递归求解

由于代码比较简单,这里就不做过多解释了。

如图所示,相同的颜色代表了方法被传入相同的参数。

方法二:备忘录算法

在以上代码中,集合map是一个备忘录。当每次需要计算F(N)的时候,会首先从map中寻找匹配元素。如果map中存在,就直接返回结果,如果map中不存在,就计算出结果,存入备忘录中。

方法三:动态规划求解

程序从 i=3 开始迭代,一直到 i=n 结束。每一次迭代,都会计算出多一级台阶的走法数量。迭代过程中只需保留两个临时变量a和b,分别代表了上一次和上上次迭代的结果。 为了便于理解,我引入了temp变量。temp代表了当前迭代的结果值。

题目二: 国王和金矿

有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?

方法一:排列组合

每一座金矿都有挖与不挖两种选择,如果有N座金矿,排列组合起来就有2^N种选择。对所有可能性做遍历,排除那些使用工人数超过10的选择,在剩下的选择里找出获得金币数最多的选择。

代码比较简单就不展示了,时间复杂度也很明显,就是O(2^N)。

F(n,w) = 0 (n<=1, w<p[0]);

F(n,w) = g[0] (n==1, w>=p[0]);

F(n,w) = F(n-1,w) (n>1, w<p[n-1])

F(n,w) = max(F(n-1,w), F(n-1,w-p[n-1])+g[n-1]) (n>1, w>=p[n-1])

其中第三条是补充上去的,原因不难理解。

方法二:简单递归

把状态转移方程式翻译成递归程序,递归的结束的条件就是方程式当中的边界。因为每个状态有两个最优子结构,所以递归的执行流程类似于一颗高度为N的二叉树。

方法的时间复杂度是O(2^N)。

方法三:备忘录算法

在简单递归的基础上增加一个HashMap备忘录,用来存储中间结果。HashMap的Key是一个包含金矿数N和工人数W的对象,Value是最优选择获得的黄金数。

方法的时间复杂度和空间复杂度相同,都等同于备忘录中不同Key的数量。

方法四:动态规划

方法利用两层迭代,来逐步推导出最终结果。在外层的每一次迭代,也就是对表格每一行的迭代过程中,都会保留上一行的结果数组 preResults,并循环计算当前行的结果数组results。

方法的时间复杂度是 O(n * w),空间复杂度是(w)。需要注意的是,当金矿只有5座的时候,动态规划的性能优势还没有体现出来。当金矿有10座,甚至更多的时候,动态规划就明显具备了优势。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat(6)生命周期

【0】README0.1&#xff09;本文部分文字描述转自“深入剖析tomcat”&#xff0c;旨在学习 “tomcat生命周期” 的基础知识&#xff1b;0.2&#xff09;for source code, please visit https://github.com/pacosonTang/HowTomcatWorks/tree/master/chapter6 0.3&#xff09;温…

移位操作提高代码的可读性_本地记录或类,以提高流操作的可读性

移位操作提高代码的可读性Java 14带有Records的预览语言功能—一种特殊的轻量级类&#xff0c;可以与其他语言中的类似构造进行比较&#xff0c;例如C&#xff03;中的record类&#xff0c;Kotlin中的data类和Scala中的case类。 A&#xff09;已经有许多博客文章解释Java 14记…

漫画算法:无序数组排序后的最大相邻差值

转载自 玻璃猫 程序员小灰 小灰一边回忆一边讲述起当时面试的情景...... 题目&#xff1a;有一个无序整型数组&#xff0c;如何求出这个数组排序后的任意两个相邻元素的最大差值&#xff1f;要求时间和空间复杂度尽可能低。&#xff08;例如&#xff1a;无序数组 2,3,1,4,6&…

serv-u 数据备份_如何使用用户数据脚本在EC2实例上安装Apache Web Server

serv-u 数据备份你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何使用用户数据脚本在EC2实例上安装Apache Web Server。 在我以前的教程之一中&#xff0c;我已经解释了如何使用AWS控制台启动EC2实例。如果您还没有完成该操作&#xff0c;我建议您先进行一下操作。…

哈儿小波分解和重构(降维和升维)实现算法

【0】README0.1&#xff09;本文旨在讲解 哈儿小波变换&#xff08;分解和重构&#xff09;进行数据的降维和升维&#xff1b;【timestamp: 1703281610】时隔几个月再来review 哈儿小波变换算法的具体思路&#xff1a;1&#xff09;分解降维&#xff1a;首先对所有item进行分解…

漫画算法:判断2的乘方

转载自 玻璃猫 程序员小灰 小灰陷入回忆当中。。。。 题目&#xff1a;实现一个方法&#xff0c;判断一个正整数是否是2的乘方&#xff08;比如16是2的4次方&#xff0c;返回True&#xff1b;18不是2的乘方&#xff0c;返回False&#xff09;。要求性能尽可能高。 解法一&…

k66 pit计时功能配置_PIT,JUnit 5和Gradle –仅需额外的一行配置

k66 pit计时功能配置在Gradle&#xff08;带有gradle-pitest-plugin 1.4.7&#xff09;中发现简单&#xff0c;改进的PIT和JUnit 5配置。 不可否认&#xff0c;如今JUnit 5越来越受欢迎。 虽然为JUnit 5提供了一个专用于PIT的插件&#xff0c;并且gradle-pitest-plugin支持了很…

tomcat(7)日志记录器

【0】README0.1&#xff09;本文部分文字描述转自&#xff1a;“深入剖析tomcat”&#xff0c;旨在学习 “tomcat的日志记录器” 的基础知识&#xff1b;0.2&#xff09;intro to 日志记录器&#xff1a;日志记录器是用来记录消息的组件&#xff1b;0.3&#xff09;for complet…

漫画算法:最小栈的实现

转载自 玻璃猫 程序员小灰 小灰回忆起当时的情景…… 题目&#xff1a;实现一个栈&#xff0c;带有出栈&#xff08;pop&#xff09;&#xff0c;入栈&#xff08;push&#xff09;&#xff0c;取最小元素&#xff08;getMin&#xff09;三个方法。要保证这三个方法的时间复杂度…

oidc auth2.0_将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成

oidc auth2.0如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权&#xff0c;则可能需要将下一个Web应用程序与Auth0集成。 有多种方法可以执行此操作&#xff0c;例如&#xff0c;如果要将Jenkins与Auth0集成&#xff0c;则可以使用SAML v2&#xff1b;否则&a…

follow 开源项目关于NoClassDefFoundError错误的解决方法

【0】README0.1&#xff09;本文旨在po出当我们follow open projects 的时候&#xff0c;遇到一些在open API中不存在&#xff08;NoClassDefFoundError&#xff09;的类时的解决方法&#xff1b;【1】problemsolution&#xff1a;1.1&#xff09;problem&#xff1a;一般case下…

camel apache_如何使用Apache Camel,Quarkus和GraalVM快速运行100个骆驼

camel apache今天&#xff0c;我继续在youtube上练习&#xff0c;并录制了10分钟的视频&#xff0c;介绍了如何创建一个新的Camel and Quarkus项目&#xff0c;该项目包括Rest和HTTP服务以及开箱即用的健康检查和指标。 然后比较在JVM模式下运行示例与使用GraalVM编译的本机的…

漫画算法:找出缺失的整数

转载自 玻璃猫 程序员小灰 小灰一边回忆一边讲述起当时面试的情景...... 题目&#xff1a;一个无序数组里有99个不重复正整数&#xff0c;范围从1到100&#xff0c;唯独缺少一个整数。如何找出这个缺失的整数&#xff1f; 解法一&#xff1a; 创建一个HashMap&#xff0c;以1到…

tomcat(8)载入器

【0】README0.0&#xff09;本文部分描述转自“深入剖析tomcat”&#xff0c;旨在学习 tomcat(8)载入器 的基础知识&#xff1b;0.1&#xff09;一个标准web 应用程序中的载入器&#xff1a;简单来说就是 tomcat中的载入器&#xff1b;0.2&#xff09;servlet容器需要实现一个自…

micrometer_具有InlfuxDB的Spring Boot和Micrometer第3部分:Servlet和JDBC

micrometer在上一个博客中&#xff0c;我们使用由InfluxDB支持的Micrometer设置了React式应用程序。 在本教程中&#xff0c;我们将使用传统的带有JDBC的基于Servlet的阻塞Spring堆栈。 我选择的数据库是postgresql。 我将使用与先前博客文章相同的脚本。 因此&#xff0c;我…

漫画算法:辗转相除法是什么鬼

转载自 玻璃猫 程序员小灰 大四毕业前夕&#xff0c;计算机学院的小灰又一次顶着炎炎烈日&#xff0c; 去某IT公司面试研发工程师岗位…… 半小时后&#xff0c;公司会议室&#xff0c;面试开始…… 小灰奋笔疾书&#xff0c;五分钟后…… 小灰的思路十分简单。他使用暴力…

tomcat(9)Session管理

【0】README0.0&#xff09;本文部分描述转自“深入剖析tomcat”&#xff0c;旨在学习“tomcat-Session管理” 的基础知识&#xff1b;0.1&#xff09;Catalina通过一个称为Session 管理器的组件来管理建立的Session对象&#xff0c;该组件由org.apache.catalina.Manager接口来…

micrometer_具有InlfuxDB的Spring Boot和Micrometer第2部分:添加InfluxDB

micrometer自从我们添加了基本应用程序以来&#xff0c;是时候启动InfluxDB实例了。 我们将按照之前的教程进行操作&#xff0c;并添加一个docker实例。 docker run –rm -p 8086&#xff1a;8086 –name influxdb-本地influxdb 是时候在我们的pom上添加微米InfluxDB依赖项了…

漫画:什么是volatile关键字?(整合版)

转载自 永远爱大家的 程序员小灰 ————— 第二天 ————— ———————————— Java内存模型简称JMM&#xff08;Java Memory Model&#xff09;&#xff0c;是Java虚拟机所定义的一种抽象规范&#xff0c;用来屏蔽不同硬件和操作系统的内存访问差异&#xff0c;让j…

tomcat(supplement)HttpConnector.initialize() 和 start() 方法 以及 StandardContext.start()方法的分析

【0】README 0.0&#xff09;本文中源代码的背景&#xff0c;参见 tomcat(9)session管理 0.1&#xff09;本文主要以图片的形式分析他们大致的调用过程&#xff1b; 0.2&#xff09;HttpConnector org.apache.catalina.connector.http.HttpConnector; 而StandardContext o…