0
点赞
收藏
分享

微信扫一扫

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

minute_5 2024-05-06 阅读 16
算法

例题一

解法(暴搜 -> 记忆化搜索 -> 动态规划):

算法思路:

暴搜:

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. 每次返回的时候,将结果加⼊到备忘录⾥⾯。

举报

相关推荐

0 条评论