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

介绍递归和动态规划

暴力递归:
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)的值不就出来了吗?

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

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

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

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

  1. 数据结构与算法之暴力递归改动态规划

    数据结构与算法之暴力递归改动态规划 目录 二维数组最小路径和 暴力递归改动态规划解析 任意选择数组arr中的数字,看能不能累加得到aim 1. 二维数组最小路径和 (一) 题目描述 (二) 思路 递归 ...

  2. 暴力递归转动态规划----以货币数问题展开

    接着上道题,这道题也是用来感受暴力递归优化成动态规划的套路.先想暴力尝试的方法,然后优化成动态规划.首先是原问题的暴力尝试方法.只有想出尝试方法是最难.最重要的. 我们首先来看一下题目: 给你一个数组 ...

  3. 史上最全数据结构算法之递归系列学习,建议收藏!

    写在前边 接下来分享的文章是关于递归的,这篇文章不单单分享递归的一切,我觉得更重要的是向每位读者传递一个思想.思想?对的,没错!这篇文章不能说包含递归的边边角角,但是通过自己的理论上的学习和实践,有了 ...

  4. 象棋跳马问题(由暴力递归->动态规划)

    跳马问题解释:         象棋中马走日,从(0,0)点出发到达目标位置,规定走K步,问:能走到目标位置的所有方法数,象棋棋盘规模10*9大小. public static int jump(in ...

  5. 带你击杀动态规划梦魇-从暴力递归到动态规划

    本文章欢迎转载,但是转载请标明出处,程序锋子https://blog.csdn.net/l13591302862/article/details/111410091 想要分享下自己之前学习动态规划的过 ...

  6. 暴力递归到动态规划 02 (绝顶聪明的人的纸牌游戏)

    1.题目 什么是绝顶聪明,比如有指派 50 100 20 10 ,绝顶聪明的人第一次手会选择10,则后手不管选哪个,这个先手都能取得100,最后取得最大总和,成为赢家 2. 暴力递归 递归终止条件,如 ...

  7. 汉诺塔递归的空间复杂度_暴力递归与动态规划 1.0

    有些暴力递归不能被改成动态规划,因为他本身要求的解空间无法被压缩了. eg:汉诺塔问题,我们必须打印那些步骤. 如果要写一个动态规划,先写成暴力递归的版本,然后模板化修改. 先写递归版本: 不妨记递归 ...

  8. 暴力递归到动态规划 05 (贴纸拼词)

    题目链接 1. 暴力递归(超时) public int minStickers(String[] stickers, String target) {int result = minSticker(s ...

  9. 数据结构和算法之暴力递归到动态规划01-绝顶聪明纸牌问题

    从一开始的暴力递归到傻瓜式的缓存动态规划到最终的动态规划 package day_16;/*** 给定一个整型数组arr,代表数值不同的纸牌排成一条线* 玩家A和玩家B依次拿走每张纸牌* 规定玩家A先 ...

最新文章

  1. P3952 NOIP2017 时间复杂度
  2. java Servlet学习笔记
  3. CSS知识点——可替换元素vs不可替换元素
  4. Javascript 页面模板化 ——大部分人没有使用过的方法
  5. pytorch Tensor的操作和Numpy之间的转化(三)
  6. ECS vs K8S
  7. 设计模式(5)--工厂模式
  8. CF559C-Gerald and Giant Chess【计数类dp】
  9. FreeMarker MyEclipse IDE
  10. jmeter根据循环获取参数_Jmeter--同线程组循环获取数据库数据传递请求
  11. Android轉檔案到iphone,在 Mac 上要如何存取 Android 手機中的檔案,傳輸檔案沒問題...
  12. oracle创建用户
  13. readelf命令使用
  14. mw150um 驱动程序win10_win10系统版水星mw150us无线网卡驱动
  15. 真实诈骗案例积累(一)
  16. NeHe_001_创建一个OpenGL窗口
  17. Cufflinks的使用
  18. linux安装git并配置GitHub账号,本地与GitHub之间进行文件的上传(push)、下载(克隆)、更新
  19. 关于mikefile 萌新用法
  20. 后序遍历链式二叉树(递归和非递归)

热门文章

  1. 5种SpringBoot热部署方式,你用哪种?
  2. plsql查询乱码问题解决
  3. Sql Server内置函数实现MD5加密
  4. python爬虫 单线程的多任务异步协程
  5. QT5获取运行程序的工作目录与程序所在的目录
  6. 玛酷机器人课程视频_建阳玛酷机器人丨2019WRO机器人比赛凯旋而归!
  7. Redis在Window服务下的安装
  8. 文件打开特别慢_“Origin进不去、下载慢”的解决办法合集
  9. python求123逆序数_应用Python来计算排列中的逆序数个数
  10. 如何允许网页中的编辑器访问剪切板_Vditor下一代的 Markdown 编辑器,为未来而构建...