史上最容易理解的暴力递归和动态规划~~

            

        史上最容易理解的暴力递归和动态规划~~



    介绍递归和动态规划


暴力递归:
1, 把问题转化为
规模缩小了的同类问题的子问题
2, 有明确的不需要继续进行递归的条件(base case)
3, 有当得到了子问题的结果之后的决策过程

4, 不记录每一个子问题的解(区别于动态规划2)


动态规划
1, 从暴力递归中来
2, 将每一个子问题的解记录下来, 避免重复计算
3, 把暴力递归的过程, 抽象成了状态表达

4, 并且存在化简状态表达, 使其更加简洁的可能


动态规划其实是由暴力递归演变而来的,每个动态规划的接法基本都能找到其动态规划的版本~

他们的关系如下:

暴力递归------》依赖关系(套路,即记忆关系)------》动态规划


下面以一道题为例子来向大家详细的介绍一下:


先理解一下题意:

给定一个数组和一个整数,可以随便选择arr数组里面的数字,看看累加起来能不能得到aim,可以得到就返回true,不可以返回false

eg :arr[] = { 3, 2, 9, 7 };  Aim = 21;返回true 3+2+9+7=21

        arr[] = { 3, 2, 9, 7 }; Aim = 13;返回false,无法组合得到13



思路分析:

先用暴力递归的方式来解决:


先看一下方法的参数,参数有arr[]和Aim是题目提供的,我们自己定义的有i和sum,这两个参数是什么意思呢?

他们的含义是,在一个数组中,从i下标开始,可以任意去i后面的数进行累加,累加的和为sum,看图:



如果你能想到这个图或者说看到这个图,你就已经成功了一半~~

可以发现,要判断这个数组中是否有满足要求的组合,只要看最后一行是否有相应的aim值就可以了。

所以,就有了下面的暴力递归:



暴力递归之后,就是动态规划了~

来来来,重点来了,从暴力递归转变到动态规划,跟题意是没有半毛钱关系的~

下面划重点了:

暴力递归------》依赖关系(套路,即记忆关系)------》动态规划

这里还差了个依赖关系:

啥都别说了,先画个图吧嘻嘻~

还是以上面那个例子为主:

arr[3] = {2,3,7};

aim = 10;

那么i的取值范围就是0~3了

sum的取值则是2+3+7=12即(0~12)

先看暴力破解法的basecase:


辣么,第三行sum等于Aim的值就为true,其他为false;

再看基本关系:


通过细细分析,可以得到下面的依赖关系图了~

图中的方框加×是(i,sum)的依赖,也就是说,要想得到(I,sum)的值,只要知道两个方框加×里面的值就可以推出来了( 不是我说的,是程序里面体现出来的)那么,因为第三列的值都知道了,那么其他列的值肯定也可以通过这一列的值推出来,那么我们所要求的(0,0)的值不就出来了吗?


这个依赖关系出来之后,那么动态规划的解也就出来了~~~(开心)


其实这个方法我也是思考了很久才领悟的~

希望对你们也能有所帮助~~不懂欢迎留言,懂得帮忙点个赞~~~

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

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

相关文章

英雄联盟与人生奋斗的类比讨论

自从去年毕业之后就已经很少玩英雄联盟了,最近半年更是一次都没碰过这个游戏了。 更新还是异常的频繁,打斗还是异常的激烈,比赛还是异常的水(S系列中国队的表现)。 我今天并不是想追忆曾经的激情,而是想把…

如何最好手机硬件测试软件,手机硬件出现故障?简单几部教你自己动手检测! _手机资讯...

很多人在使用手机时,经常遇到例如屏幕触摸不准、距离感应器不反应、手机按键失灵等类似问题,有的情况是系统故障,但大多数是属于硬件故障,那如何判定呢?其实很多安卓手机自带的有硬件检测工具,下面就以小米…

qq传输文件的软件测试点,超强新功能 QQ传文件夹测试版抢先试用

QQ传文件夹测试版试用(1)中关村在线软件事业部消息 腾讯体验中心今日(7月29日)发布了一个新的体验项目“QQ2009传文件夹测试版”。QQ的传文件功能,相信多数用户都使用过。在之前的版本中,很多用户反馈希望增加传文件夹的功能,方便多文件的传输…

黑色玫瑰服务器延迟高,LOL:含金量最高的服务器,黑色玫瑰垫底,最后一个钻石起步!...

原标题:LOL:含金量最高的服务器,黑色玫瑰垫底,最后一个钻石起步!黑色玫瑰。它是英雄联盟中非常特别的一个大区。这个大区是中间位置,电十,却是比电二高手还要多的地方。因为这个大区小姐姐特别的…

Java网络编程————UDP实现ThinkPad S5网络唤醒

功能要求:通过Java程序实现ThinkPad S5 笔记本网络唤醒 必备知识: 一、定义:网络唤醒,通过局域网、互联网或通讯网络,以有线网卡的形式,向目标电脑发送魔法包(Magic Packet),让电脑自动开机。…

奥特曼系列ol服务器名称带怪兽,《奥特曼系列ol》怪兽图鉴 怪兽阵容

《奥特曼系列ol》这款游戏中的怪兽图鉴也是很多玩家非常关注的问题之一哦,随着游戏的不断的更新,游戏也是加入了不少全新的玩法,一定让很多玩家觉得有些迷惑吧。下面小编为大家带来《奥特曼系列ol》怪兽图鉴以及怪兽阵容,希望大家…

继上一篇博客--javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

通过动态分配地址来提升javaweb文件下载接口的其兼容性和可扩展性: (上篇博文地址:https://blog.csdn.net/weixin_37766296/article/details/80044000)log4j.properties 文件: log4j.rootLogger debug,stdout,D,Elog4…

服务器主机启动不显示,服务器主机不启动怎么回事

服务器主机不启动怎么回事 内容精选换一换本文介绍了主机迁移服务SMS各特性版本的功能发布和对应的文档动态,新特性将在各个区域(Region)陆续发布,欢迎体验。源端服务器数据收集声明。源端服务器上安装和配置完迁移Agent后,迁移Agent会把源端…

最简明扼要的 Systemd 教程,只需十分钟

systemctl常用命令介绍~~~Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。 Systemd是一个系统管理守护进程、工具和库的集合,用于取代System V初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。启动及服务大多数主流发行版要…

Java常用设计模式————抽象工厂模式

简介 每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。 与工厂方法模式的区别 工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构,因此抽象工厂模式在结构上要比工厂方法模式更加复杂和抽象,也更…

CSS新手入门教程~~~~

CSS新手入门教程~~~~CSS简介:什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在…

Docker必备知识整理

Docker简介 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 Docker是用Go语言…

Exception和Error深入分析~~~

Exception和Error深入分析~~~Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。 Exception 和 Erro…

Java常用设计模式————原型模式(二)之深拷贝与浅拷贝

引言 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可…

Java面试宝典————基础篇

参考原文:《Java面试题全集(上)》 1.Java中的基本数据类型有哪些? 类型:byte short int long float double boolean char 字节:1 2 4 8 4 8 1 2 2.面向…

Git初学札记(零)————EGIT完成Eclipse到GitHub一条龙

eclipse安装Egit插件 首先我们要找到所需的egit插件的url更新地址。百度一大堆,但是我还是希望自己去寻找。 打开Eclipse Downloads官网,在页面底部直接输入“egit”关键字,并直接点击第一条搜索到的结果。然后点击Downloads标签页&#xff0…

Eclipse生成SSH传输密钥并实现GitHub的SSH代码提交

生成公私密钥 打开eclipse首选项完成如下操作:保存密钥:这里注意,博主之前已经生成过密钥了,因此这里只是演示截图,如果此时点击保存,会弹出“是否覆盖”提示框。 其中,id_rsa代表非对称加密算法…

SpringBoot————快速搭建springboot项目

完成项目的创建信息 浏览器打开SPRING INITIALIZR网址: http://start.spring.io/ 如下图所示完成配置: 1.完成基础项目配置 2.相关名称 3.依赖jar包,如果是web项目,那么这里选择的Web依赖已经包含了开发web项目所必须的服务器…

史上最容易理解————GET和POST两种基本请求方法的区别

GET和POST两种基本请求方法的区别GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。你可能自己写过无数个GET和POST请求,…

SpringBoot————JPA快速使用

本篇博客源码地址:https://github.com/DragonWatcher/ease-run 概述 Hibernate与JPA 本篇博客中的web项目选用Hibernate作为持久层框架。在Spring Boot中,我们需要了解另一个概念:JPA 上一句话可能有些歧义,并不是说JPA就是Sp…