史上最容易理解的暴力递归和动态规划~~
史上最容易理解的暴力递归和动态规划~~
介绍递归和动态规划
暴力递归:
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)的值不就出来了吗?
这个依赖关系出来之后,那么动态规划的解也就出来了~~~(开心)
其实这个方法我也是思考了很久才领悟的~
希望对你们也能有所帮助~~不懂欢迎留言,懂得帮忙点个赞~~~
史上最容易理解的暴力递归和动态规划~~相关推荐
- 数据结构与算法之暴力递归改动态规划
数据结构与算法之暴力递归改动态规划 目录 二维数组最小路径和 暴力递归改动态规划解析 任意选择数组arr中的数字,看能不能累加得到aim 1. 二维数组最小路径和 (一) 题目描述 (二) 思路 递归 ...
- 暴力递归转动态规划----以货币数问题展开
接着上道题,这道题也是用来感受暴力递归优化成动态规划的套路.先想暴力尝试的方法,然后优化成动态规划.首先是原问题的暴力尝试方法.只有想出尝试方法是最难.最重要的. 我们首先来看一下题目: 给你一个数组 ...
- 史上最全数据结构算法之递归系列学习,建议收藏!
写在前边 接下来分享的文章是关于递归的,这篇文章不单单分享递归的一切,我觉得更重要的是向每位读者传递一个思想.思想?对的,没错!这篇文章不能说包含递归的边边角角,但是通过自己的理论上的学习和实践,有了 ...
- 象棋跳马问题(由暴力递归->动态规划)
跳马问题解释: 象棋中马走日,从(0,0)点出发到达目标位置,规定走K步,问:能走到目标位置的所有方法数,象棋棋盘规模10*9大小. public static int jump(in ...
- 带你击杀动态规划梦魇-从暴力递归到动态规划
本文章欢迎转载,但是转载请标明出处,程序锋子https://blog.csdn.net/l13591302862/article/details/111410091 想要分享下自己之前学习动态规划的过 ...
- 暴力递归到动态规划 02 (绝顶聪明的人的纸牌游戏)
1.题目 什么是绝顶聪明,比如有指派 50 100 20 10 ,绝顶聪明的人第一次手会选择10,则后手不管选哪个,这个先手都能取得100,最后取得最大总和,成为赢家 2. 暴力递归 递归终止条件,如 ...
- 汉诺塔递归的空间复杂度_暴力递归与动态规划 1.0
有些暴力递归不能被改成动态规划,因为他本身要求的解空间无法被压缩了. eg:汉诺塔问题,我们必须打印那些步骤. 如果要写一个动态规划,先写成暴力递归的版本,然后模板化修改. 先写递归版本: 不妨记递归 ...
- 暴力递归到动态规划 05 (贴纸拼词)
题目链接 1. 暴力递归(超时) public int minStickers(String[] stickers, String target) {int result = minSticker(s ...
- 数据结构和算法之暴力递归到动态规划01-绝顶聪明纸牌问题
从一开始的暴力递归到傻瓜式的缓存动态规划到最终的动态规划 package day_16;/*** 给定一个整型数组arr,代表数值不同的纸牌排成一条线* 玩家A和玩家B依次拿走每张纸牌* 规定玩家A先 ...
最新文章
- P3952 NOIP2017 时间复杂度
- java Servlet学习笔记
- CSS知识点——可替换元素vs不可替换元素
- Javascript 页面模板化 ——大部分人没有使用过的方法
- pytorch Tensor的操作和Numpy之间的转化(三)
- ECS vs K8S
- 设计模式(5)--工厂模式
- CF559C-Gerald and Giant Chess【计数类dp】
- FreeMarker MyEclipse IDE
- jmeter根据循环获取参数_Jmeter--同线程组循环获取数据库数据传递请求
- Android轉檔案到iphone,在 Mac 上要如何存取 Android 手機中的檔案,傳輸檔案沒問題...
- oracle创建用户
- readelf命令使用
- mw150um 驱动程序win10_win10系统版水星mw150us无线网卡驱动
- 真实诈骗案例积累(一)
- NeHe_001_创建一个OpenGL窗口
- Cufflinks的使用
- linux安装git并配置GitHub账号,本地与GitHub之间进行文件的上传(push)、下载(克隆)、更新
- 关于mikefile 萌新用法
- 后序遍历链式二叉树(递归和非递归)
热门文章
- 5种SpringBoot热部署方式,你用哪种?
- plsql查询乱码问题解决
- Sql Server内置函数实现MD5加密
- python爬虫 单线程的多任务异步协程
- QT5获取运行程序的工作目录与程序所在的目录
- 玛酷机器人课程视频_建阳玛酷机器人丨2019WRO机器人比赛凯旋而归!
- Redis在Window服务下的安装
- 文件打开特别慢_“Origin进不去、下载慢”的解决办法合集
- python求123逆序数_应用Python来计算排列中的逆序数个数
- 如何允许网页中的编辑器访问剪切板_Vditor下一代的 Markdown 编辑器,为未来而构建...