——从深度优先搜索过渡到动态规划
记忆化搜索是动态规划的一种实现方式,记忆化搜索使用搜索的方式实现了动态规划,因此记忆化搜索就是动态规划。
将函数的计算结果保存下来,下次通过同样的参数访问时,直接返回保存下来的结果。
记忆化搜索通常能够将指数级别的时间复杂度降低到多项式级别。
跟系统设计中的cache(缓存)很像,第一次浏览图片的时候需要加载出来,然后系统会将图片加载到缓存中,之后浏览图片的时候就不需要加载了。
动态规划避免了重复计算,因此动态规划速度很快。
记忆化搜索非常适合博弈型动态规划。

  1. //一共有n个石头,两人轮番拿1~3个,拿到最后一个的赢,请判断是否先手必赢
  2. bool canWinBash(int n)
  3. {
  4. unordered_map<int, bool> memo;
  5. return memoSearch(n, memo);
  6. }
  7. bool memoSearch(int n, unordered_map<int, bool> memo)
  8. {
  9. if (n <= 3)
  10. {
  11. return true;
  12. }
  13. if (memo.find(n) != memo.end())
  14. {
  15. return memo[n];
  16. }
  17. for (int i = 1; i <= 3; i++)
  18. {
  19. if (!memoSearch(n - i, memo))
  20. {
  21. memo.insert({n, true});
  22. return true;
  23. }
  24. }
  25. return false;
  26. }

通配符匹配

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
image.png

思路
记忆化搜索 - 图2