记忆化搜索

Posted bigyellowdog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记忆化搜索相关的知识,希望对你有一定的参考价值。

记忆化搜索

什么是记忆化搜索?

  • 百度百科:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。
  • 个人理解:就是每求到一个状态就保存下来,下次再遇到这个状态直接调用即可

它有什么好处?

  1. 用记搜容易理解。避免了dp的高思维难度
  2. 快。因为每个状态只会算一遍,所以相对与深搜和广搜会快许多
  3. 好写。

如何实现?

  • 算法流程图如下:
#include <iostream>
#include <cstdio>

int dfs(int x)
{
    if(状态[x]保存过) return 状态[x];
    if(到达目的地) return 递归最底层的解
    int tot=0;  //执行到这里说明状态[x]没被保存过,定义变量tot为方案数
    for(int i=1;i<=算符种数;i++)
        tot+=分支方案数
    状态[x]=tot;
    return 状态[x];
}

int main()
{
    cout<<dfs(x); //输出以x为开始的方案数
    return 0;
}

总结

  • 记忆化搜索是个非常功利性的算法。有时候在考场中写正解dp可能要想很久,甚至边界设置错误导致全WA,而记忆化搜索容易写,且易理解,所以掌握好是很必要的。
  • 记忆化搜索是一种思想,并不是所有的记搜都按照算法模版写的,而是因题而异。但思想是一致的,多刷几道题即可熟练掌握
  • 题目列表:
    • 洛谷P4017 最大食物链计数:传送门(巧妙利用记搜代替了dp)
    • 洛谷P1434 [SHOI2002]滑雪:传送门(巧妙利用记搜比dfs快的优势)

以上是关于记忆化搜索的主要内容,如果未能解决你的问题,请参考以下文章

动态规划-记忆化搜索

FZU 2092 收集水晶 BFS记忆化搜索

P1044 栈 卡特兰数/记忆化搜索

poj 1191 棋盘切割 (压缩dp+记忆化搜索)

HDU 1078 FatMouse and Cheese (记忆化搜索+dp)

记忆化搜索