首页 > 其他分享 >记忆化搜索

记忆化搜索

时间:2023-09-28 15:45:52浏览次数:34  
标签:pos dfs 记忆 数组 搜索 dp

记忆化搜索

记忆化搜索是啥:

  • 不依赖任何 外部变量

  • 答案以返回值的形式存在, 而不能以参数的形式存在(就是不能将 dfs 定义成 dfs(pos,tleft,nowans), 这里面的 nowans 不符合要求).

  • 对于相同一组参数, dfs 返回值总是相同的

说白了,记忆化搜索就等于动态规划,只不过换了种方式写罢了。

那么怎么写记忆化搜索捏?

方法一:

  1. 把这道题的dp状态和方程写出来
  2. 根据他们写出dfs函数
  3. 添加记忆化数组

就比如你写最长上升子序列,推出来 \(dp[i] = max\{dp[j]+1\}\quad 1 \leq j < i \text{且}a[j]<a[i]\)

然后就可以写记忆化了。

方法二:

  1. 写出这道题的暴搜程序(最好是dfs)
  2. 将这个dfs改成"无需外部变量"的dfs
  3. 添加记忆化数组

这两种方法都挺常用的,按照实际情况来吧。

记忆化搜索的优缺点:


优点:
  • 记忆化搜索可以避免搜到无用状态, 特别是在有状态压缩时。

举例: 给你一个有向图(注意不是完全图),经过每条边都有花费,求从点 \(1\) 出发,经过每个点恰好一次后的最小花费(最后不用回到起点),保证路径存在。

dp状态很显然:

设 \(dp[pos][mask]\) 表示身处在 \(pos\) 处,走过 \(mask\)(mask为一个二进制数) 中的顶点后的最小花费。

常规 \(dp\) 的状态为 \(O(n\cdot 2^n)\) , 转移复杂度(所有的加在一起)为 \(O(m)\)

但是!如果我们用记忆化搜索,就可以避免到很多无用的状态,比如 \(pos\) 为起点却已经经过了 \(>1\) 个点的情况。

  • 不需要注意转移顺序(这里的"转移顺序"指正常dp中for循环的嵌套顺序以及循环变量是递增还是递减)。

举例: 用常规 dp 写"合并石子"需要先枚举区间长度然后枚举起点,但记忆化搜索直接枚举断点(就是枚举当前区间由哪两个区间合并而成)然后递归下去就行。

  • 边界情况非常好处理, 且能有效防止数组访问越界。

  • 写起来简单易懂

  • 有些 dp(如区间 dp)用记忆化搜索写很简单但正常 dp 很难。

  • 记忆化搜索天生携带搜索天赋,可以使用技能"剪枝"。

缺点:
  • 致命伤: 不能滚动数组。
  • 有些优化比较难加。
  • 由于递归, 有时效率较低但不至于 TLE (状压dp除外)。

记忆化搜索的注意事项:

  • 别忘了加记忆化。
  • 边界条件要加在检查当前数组值是否为 - 1 前(防止越界)
  • 数组不要开小了(
  • 在某些时候需要优化(如滚动数组、斜率优化时还是要用正常的dp

题单

标签:pos,dfs,记忆,数组,搜索,dp
From: https://www.cnblogs.com/Mitishirube0717/p/17735942.html

相关文章

  • 利用字典树实现搜索提示词
    利用字典树构建搜索提示,主要一点是在项目中字典的数据加载。@GetMapping("/searchCues")@Operation(summary="搜索提示词")publicResultsearchCues(Stringkeys){try{if(keys.isEmpty()){returnnull;}......
  • 79. 单词搜索
    给定一个mxn二维字符网格board和一个字符串单词word。如果word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例1:输......
  • 风吹散了我们,留下那凄惨的记忆
    并不是一切都是无所谓的,但为什么孤单的人总会说无所谓!    无所谓!无所谓!背后留下的却是那凄惨的回忆!记得八月十五那次邂逅吗?八月十五不想回家,就想满街逛逛,做车走到人民商场,搞笑的是竟然和朋友走散了,索性就自己逛吧!走到王府西门"不回家干吗从这走?到东边找个网吧,进去就......
  • pro table 中搜索select联动另一个select的问题
     问题一、一个select能联动另一个select//部门project列表,从服务端获取const[deptProjListFromServer,setDeptProjListFromServer]=useState<{[key:string]:any}>([]);//当前projectconst[currDepartmentId,setDepartmentId]=useState('1');/......
  • vue3项目封装支持搜索,选中不可选,选中的数据项支持上下移动,删除的上下穿梭的树状穿梭框
     1,vue3代码1//这个是返回的所有的数据2constsourceItems=ref([])3//这是穿梭到下面的数据4consttargetItems=ref([])5//这是搜索字段6constsearchName=ref('')7//这两个要是后端返回,可不写8constex......
  • 代码随想录day21 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 2
    530.二叉搜索树的最小绝对差classSolution{private:intresult=INT_MAX;TreeNode*pre=NULL;voidtraversal(TreeNode*cur){if(cur==NULL)return;traversal(cur->left);//左if(pre!=NULL){//中......
  • Python爬虫-爬取百度搜索结果页的网页标题及其真实网址
    共两个依赖的需提前安装的第三方库:requests和bs4库cmd命令行输入安装requests库:pip3install-ihttps://pypi.douban.com/simplerequests安装bs4库:pip3install-ihttps://pypi.douban.com/simplebeautifulsoup4 本微项目源文件下载地址:https://wwuw.lanzouj.com/i1Au51......
  • 500_想在iPad上学习?这个PDF电子书搜索引擎实在太好用
    这是一篇原发布于2020-02-2909:50:00得益小站的文章,备份在此处。前段时间,各家出版社纷纷“用知识抗击疫情”,开放了自家的图书资源来倡导读者在家学习。轶哥也下载了许多电子书。不得不说原版的电子书质量就是高,这些电子书可以完美的标注,复制;相较于影印版PDF体积更小,阅读体验也......
  • 基于vue制作搜索高亮popsearch组件
    ......
  • vue3 模糊搜索 不区分大小写 多选框 element plus
    ```javascript<divclass="select-part"ref="selectRef"><divclass="check-type"><inputtype="text"class="check-type-title":placeholder="placeholder"@focus="onFo......