【动态规划入门篇】只需三步解决它
青蛙跳台阶
一、问题描述
一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级台阶。求该青蛙跳上一个 n
(0 <= n <= 100)级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
二、题目要求
运行限制
最大运行时间:1s
最大运行内存: 128M
样例
考察
三、问题分析
做动态规划需要几步,就像冰箱装大象一样,分成三步:
第一步:含义搞懂
通常动态规划都会用数组 dp[]存放东西,那存放在数组里面的究竟是什么?
这要看题目问我们什么,这一题就问青蛙跳台阶的方案数嘛,那么 dp[i]就代表第 i 个台阶有 dp[i]个方案,它问什么我们就存什么。
第二步:变量初始
初始变量一般找 2~5 个就行,下面才是重头戏啊!
第三步:关系归纳
搞清楚数组的含义和初始值之后,我们求的是第 n 个台阶方案数,题目又没给,怎么办?
找规律,做归纳总结,看看和前面的台阶方案有什么关系,这一步很重要,规律找不好直接芭比 q。
仔细看一下第二步的规律,后一个是不是等于前面两个相加,所以第 n 个公式为:
dp[n]=dp[n-1]+dp[n-2]。
三步走,打完收工!
四、编码实现
五、测试结果
六、总结与提高
如果题目改成:
一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级台阶......一直到 n 级台阶。求该青蛙跳上一个 n
(0 <= n <= 100)级的台阶总共有多少种跳法,做完之后可以在评论区交流结果。
机器人走迷宫
一、问题描述
一个机器人位于一个 m x n
**网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
题目链接:机器人走迷宫
二、题目要求
考察
数据要求
1 <= m, n <= 100
题目数据保证答案小于等于
2 * 109
样例
三、问题分析
这也是一道比较典型的动态规划问题,动态规划没做过的可以看这一篇入门:
还是用我们的三步走老套路:
第一步含义搞懂:
这是二维数组,要求出不同路径,那么就用二维数组 dp[i][j]存储不同的路径个数。
第二步变量初始:
周围一圈都是初始化 0
第三步规律归纳:
看看上面的图片有什么特别的地方,有时间可以自己动手写一下,印象会更加深刻,当时我就写了一遍。
是不是当前数组位置的到数 = 左面的数字 + 上面的数字啊!
所以 dp[m][n]=dp[m][n-1]+dp[m-1][n];
三步走,打完收工!
四、编码实现
五、测试结果
输入 3 7:
连续子数组的最大和
一、问题描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
题目链接:连续子数组的最大和
二、题目要求
要求:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
要求时间复杂度为 O(n)。
示例:
考察
三、问题分析
这也是一道比较典型的动态规划问题,动态规划没做过的可以看这一篇入门题解:
还是用我们的三步走老套路:
第一步含义搞懂:
这一题在力扣上面是简单题,但我第一次做想了半天要怎么往动态规划上面靠拢,瞬间觉得这一题不简单。
先看题目要求是什么,求出数组中连续子数组的最大值,下面就以示例里面的值讲解。
设一维数组 dp[i]就代表从区间 1~i 的范围里面,以 num[i]结尾的连续子数组最大值。
第二步变量初始:
这一题我们只需要初始一个变量就行,那就是 dp[0]=nums[0]
第三步规律归纳:
这一步就是最关键的一步了,能不能娶上媳妇就看最后一哆嗦了。
我先把 nums 数组和 dp 数组里面的值列举一下,看看能不能发现规律:
仔细看一下,每一个 dp[i]是如何得到的,是不是当前位的 num[i]加上前面一个 dp[i-1]数又或是没加,那没加是因为前面的数是负的嘛。所以,规律出现:
三步走,打完收工!
评论