代码随想录算法训练营第三十八天|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
2023-12-13 06:05:22
代码随想录算法训练营第三十八天|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
动态规划理论基础
动态规划理论基础
文章讲解:https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
视频讲解:https://www.bilibili.com/video/BV13Q4y197Wg
看完代码随想录之后的想法
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。
动态规划五步骤:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 打印dp数组
自己实现过程中遇到哪些困难
斐波那契数
509. 斐波那契数
文章讲解:https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html
题目链接:https://leetcode.cn/problems/fibonacci-number/
视频讲解:https://www.bilibili.com/video/BV1f5411K7mo/
自己看到题目的第一想法
斐波那契数列,S(n) = S(n - 1) + S(n-2),可以用递归去处理。这里主要学习用动态规划的思路去处理。
看完代码随想录之后的想法
动态规划五步骤:
- 确定dp数组(dp table)以及下标的含义
- dp[i]的定义为:第i个数的斐波那契数值是dp[i]
- 确定递推公式
- 题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
- dp数组如何初始化
- 题目中把如何初始化也直接给我们了,dp[0] = 0;dp[1] = 1;
- 确定遍历顺序
- 从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
- 打印dp数组
- 我们来推导一下,当N为10的时候,dp数组应该是如下的数列:0 1 1 2 3 5 8 13 21 34 55
自己实现过程中遇到哪些困难
按照动态规划五步骤处理业务逻辑比较简单,这里需要关注的就是边界条件的处理。边界条件未处理导致未一次ac。
爬楼梯
70. 爬楼梯
文章讲解:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF.html
题目链接:https://leetcode.cn/problems/climbing-stairs/
视频讲解:https://www.bilibili.com/video/BV17h411h7UH/
自己看到题目的第一想法
可以同递归去处理,但是这里可以试试递归五步骤。
动态规划五步骤:
- 确定dp数组(dp table)以及下标的含义
- dp[i]的定义为:第i个台阶爬到顶楼的方法数量
- 确定递推公式
- 当给定台阶n时,n-1只能走一步到n,方法数是f(n-1)。n-2只能走2步到n的方法数是f(n-2)。因此f(n)=f(n-1) + f(n-2)
- dp数组如何初始化
- 题目中把如何初始化也直接给我们了,dp[1] = 1;dp[2] = 2;
- 确定遍历顺序
- 爬楼梯是从下往上爬的因此i从小到大
- 打印dp数组
- 我们来推导一下,当N为3的时候,dp数组应该是如下的数列:1,2,3。为4时1,2,3,5。
看完代码随想录之后的想法
一样的处理逻辑,n-1个台阶方法数是f(n-1),n-2走2步到fn因此n-2为f(n-2)。因此f(n) = f(n-1) + f(n-2)。
自己实现过程中遇到哪些困难
使用最小花费爬楼梯
746. 使用最小花费爬楼梯
文章讲解:https://programmercarl.com/0746.%E4%BD%BF%E7%94%A8%E6%9C%80%E5%B0%8F%E8%8A%B1%E8%B4%B9%E7%88%AC%E6%A5%BC%E6%A2%AF.html
题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/
视频讲解:https://www.bilibili.com/video/BV16G411c7yZ/
自己看到题目的第一想法
动态规划五步骤:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 打印dp数组
看完代码随想录之后的想法
动态规划五步骤:
- 确定dp数组(dp table)以及下标的含义
- dp[i] 为第i个台阶的最小花费
- 确定递推公式
- dp[i] = Math.min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2])
- dp数组如何初始化
- dp[0] = 0; dp[1] = 0;
- 确定遍历顺序
- 从小到大遍历
- 打印dp数组
自己实现过程中遇到哪些困难
无,该题目核心就是确定递推公式,递推公式需要考虑最小值。
今日收获&学习时长
学习了动态规划五步骤:
- 确定dp数组以及下标含义
- 确定递推公式
- 确定初始化值
- 确定遍历顺序
- 打印dp数组,check结果
学习时长:
2小时
文章来源:https://blog.csdn.net/shanshe7934/article/details/134797850
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!