递归、搜索与回溯算法:记忆化搜索

例题一


解法(暴搜 -> 记忆化搜索 -> 动态规划):
算法思路:
暴搜:
a. 递归含义:给 dfs ⼀个使命,给他⼀个数 n ,返回第 n 个斐波那契数的值;
b. 函数体:斐波那契数的递推公式;
c. 递归出⼝:当 n == 0 或者 n == 1 时,不⽤套公式。
记忆化搜索:
a. 加上⼀个备忘录;
b. 每次进⼊递归的时候,去备忘录⾥⾯看看;
c. 每次返回的时候,将结果加⼊到备忘录⾥⾯。
动态规划:
a. 递归含义 -> 状态表⽰;
b. 函数体 -> 状态转移⽅程;
c. 递归出⼝ -> 初始化。
法一:记忆化搜索

法二:动态规划

例题二


解法(暴搜 -> 记忆化搜索 -> 动态规划):
算法思路:
暴搜:
a. 递归含义:给 dfs ⼀个使命,给他⼀个下标,返回从 0, 0 位置⾛到 i, j 位置⼀共有多少种⽅法;
b. 函数体:只要知道到达上⾯位置的⽅法数以及到达左边位置的⽅法数,然后累加起来即可;
c. 递归出⼝:当下标越界的时候返回 0 ;当位于起点的时候,返回 1 。
记忆化搜索:
a. 加上⼀个备忘录;
b. 每次进⼊递归的时候,去备忘录⾥⾯看看;
c. 每次返回的时候,将结果加⼊到备忘录⾥⾯。
动态规划:
a. 递归含义 -> 状态表⽰;
b. 函数体 -> 状态转移⽅程;
c. 递归出⼝ -> 初始化。
方法一:记忆化搜索

方法二:动态规划

例题三


解法(暴搜 -> 记忆化搜索 -> 动态规划):
算法思路:
暴搜:
a. 递归含义:给 dfs ⼀个使命,给他⼀个数 i ,返回以 i 位置为起点的最⻓递增⼦序列的⻓度;
b. 函数体:遍历 i 后⾯的所有位置,看看谁能加到 i 这个元素的后⾯。统计所有情况下的最⼤值。
c. 递归出⼝:因为我们是判断之后再进⼊递归的,因此没有出⼝~
记忆化搜索:
a. 加上⼀个备忘录;
b. 每次进⼊递归的时候,去备忘录⾥⾯看看;
c. 每次返回的时候,将结果加⼊到备忘录⾥⾯。
动态规划:
a. 递归含义 -> 状态表⽰;
b. 函数体 -> 状态转移⽅程;
c. 递归出⼝ -> 初始化。
解法一:记忆化搜索

解法二:动态规划

例题四


解法(暴搜 -> 记忆化搜索):
算法思路:
暴搜:
a. 递归含义:给 dfs ⼀个使命,给他⼀个区间 left, right ,返回在这个区间上能完胜的最⼩费⽤;
b. 函数体:选择 left, right 区间上的任意⼀个数作为头结点,然后递归分析左右⼦树。
求出所有情况下的最⼩值;
c. 递归出⼝:当 left >= right 的时候,直接返回 0 。
记忆化搜索:
a. 加上⼀个备忘录;
b. 每次进⼊递归的时候,去备忘录⾥⾯看看;
c. 每次返回的时候,将结果加⼊到备忘录⾥⾯。

例题五


解法(暴搜 -> 记忆化搜索 ):
算法思路:
暴搜:
a. 递归含义:给 dfs ⼀个使命,给他⼀个下标 i, j ,返回从这个位置开始的最⻓递增路径的⻓度;
b. 函数体:上下左右四个⽅向瞅⼀瞅,哪⾥能过去就过去,统计四个⽅向上的最⼤⻓度;
c. 递归出⼝:因为我们是先判断再进⼊递归,因此没有出⼝~
记忆化搜索:
a. 加上⼀个备忘录;
b. 每次进⼊递归的时候,去备忘录⾥⾯看看;
c. 每次返回的时候,将结果加⼊到备忘录⾥⾯。

相关推荐
稚南城才子,乌衣巷风流39 分钟前
ST 表(Sparse Table)算法详解:原理、实现与应用
算法
hold?fish:palm1 小时前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle1 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木1 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b2 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
危桥带雨2 小时前
排序算法(快排、归并、计数、基数排序)
数据结构·算法·排序算法
啦啦啦啦啦zzzz2 小时前
算法:回溯算法
c++·算法·leetcode
IT探索2 小时前
Linux 查找文件指令总结
linux·算法
Lumos1863 小时前
51单片机从零到实战(完结)——后续学习路线建议
算法