> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。> 目标:了解什么是记忆化搜索,并且掌握记忆化搜索算法。
> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!
> 专栏选自:动态规划算法_დ旧言~的博客-CSDN博客
> 望小伙伴们点赞👍收藏✨加关注哟💕💕
一、算法讲解
动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法:
- 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
- 与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上)。
【Tips】动态规划算法解决问题的分类
- 计数:有多少种方式走到右下角 / 有多少种方法选出k个数使得和是 sum。
- 求最大值/最小值:从左上角走到右下角路径的最大数字和最长上升子序列长度。
- 求存在性:取石子游戏,先手是否必胜 / 能不能取出 k 个数字使得和是 sum。
【Tips】动态规划dp算法一般步骤
- 确定状态表示(dp[ i ] 的含义是什么,来源:1、题目要求;2、经验+题目要求;3、分析问题时发现重复子问题)
- 状态转移方程(可求得 dp[ i ] 的数学公式,来源:题目要求+状态表示)
- 初始化(dp 表中特别的初始值,保证填 dp 表时不会越界,来源:题目要求+状态表示)
- 填表顺序(根据状态转移方程修改 dp[ i ] 的方式,来源:题目要求+状态表示)
- 返回值(题目求解的结果,来源:题目要求+状态表示)
二、算法习题
2.1 第一题
题目描述:
算法流程:
1. 状态表⽰:
这道题可以「根据题⽬的要求」直接定义出状态表⽰:
dp[i] 表⽰:第 i 个泰波那契数的值。
2. 状态转移⽅程:
题⽬已经⾮常贴⼼的告诉我们了:
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
3. 初始化:
- 从我们的递推公式可以看出, dp[i] 在 i = 0 以及 i = 1 的时候是没有办法进⾏推导的,因为 dp[-2] 或 dp[-1] 不是⼀个有效的数据。
- 因此我们需要在填表之前,将 0, 1, 2 位置的值初始化。题⽬中已经告诉我们 dp[0] = 0,dp[1] = dp[2] = 1 。
4. 填表顺序:
毫⽆疑问是「从左往右」。
5. 返回值:
应该返回 dp[n] 的值。
代码呈现: