DFS 记忆化搜索实战技巧与总结
- 记忆化搜索:有完全相同的问题或数据保存起来,带有备忘录的递归。
- 记忆化搜索的步骤:
- 添加一个备忘录(可变参数 -> 返回值)
- 递归每次返回的时候,将结果放入备忘录中
- 在每次进入递归的时候,往备忘录中查找一下
- 记忆化搜索和常规的动态规划都是动态规划,暴搜 -> 记忆化搜索 -> 动态规划
- 有大量重复的问题才能改成记忆化搜索

斐波那契数
这是一个最经典的入门案例。通过对比暴力递归和带备忘录的递归,能直观看到性能差异。
思路分析
核心在于创建一个备忘录,把不可能出现的值初始化为 -1。每次递归完成前存入结果,进入递归时先查表,有值直接返回,相当于剪枝。
代码实现
class Solution {
public:
// 记忆化搜索
int memo[31];
int fib(int n) {
memset(memo, -1, sizeof memo);
return dfs(n);
}
int dfs(int n) {
if (memo[n] != -1) {
return memo[n];
}
if (n == 0 || n == 1) {
memo[n] = n;
return n;
}
memo[n] = dfs(n - 1) + dfs(n - 2);
return memo[n];
}
};
{
:
dp[];
{
dp[] = , dp[] = ;
( i = ; i <= n; i++) {
dp[i] = dp[i - ] + dp[i - ];
}
dp[n];
}
};






