01 故事起源有一天小K去滑雪,雪山高低不平,当然小K只能从高的地方向低的地方滑,那如何选择路线才能滑的最远呢? 把这个问题抽象描述如下:
在一个二维地图中,数值代表此处山的高度,在某个点只能滑向上下左右4个相邻的点,最远的滑行路线,也就等价于找出一条最长的数值下降路线。
比如下图中的红色路线就是此时最长的一条路线,长度为10。那要如何找出这样的一条路线呢?
02
分析在每个点上,只能向周围4个方向滑行,当然前提是此处的高度必须比周围高。
我们当然可以选择尽可能高的位置出发,比如图中17比15要高。
但这种有可能会陷入局部最优解,比如从下图中的15开始,最大长度为2。而从13开始会更优,长度为5。
所以启示我们,不能简单的贪心,而是要考虑全局最优,因为每一个起点都有可能是最优的起点。那就有了初步的框架了,从每一个起点出发,把可行的路线都找出来,也就是能走的路线都走一遍,再比较全局最优的就行了,而且这也正好符合深搜的算法框架。伪代码
intfind(inti,intj){ //向4个方向尝试 for(i=0->3){ if(ok){ returnfind(next)+1 } } } intmain(){ for(i=0->n){ for(j=0->m) { t=find(i,j) ans=max(ans,t) } } } 03 问题上面的做法可以得到最优解,但有一个问题。如下例,以15为起点的时候,会尝试把6->5->4->3->2->1走一遍。但以16为起点的时候,还会尝试把这条路线走一遍,这就会导致大量的重复计算。
那能不能优化呢? 之所以重复计算,是因为每一次尝试都是重新的开始,它并不知道这条路已经走过了,也就是没有记忆,所以我们引入一种优化的方法,就是记忆化搜索。
04
记忆化搜索可以引入一个f[i][j]数组,记录以(i,j)为起点所能找到的最长路线的长度,初始赋值为-1,表示还没有走过。
当走过一点,就将对应的f[i][j]更新为以(i,j)为起点的最大长度。 再回到上面的问题,因为之前肯定走过了(2,3),对应的f[2][3]为6,当尝试从(2,4)出发时,会发现周围已经走过了,只需要更新当前的值+1即可,就避免了重复计算。
05
代码实现路线搜索intfind(vector<vector<int>>&snowMountain,vector<vector<int>>&f,inti,intj,intr,intc){ intx,y; if(f[i][j]!=-1) returnf[i][j]; f[i][j]=1; for(intk=0;k< 4;k++){ x=i+direction[k][0]; y=j+direction[k][1]; //validdirection if(x>=0&&x< r && y >=0&&y< c && snowMountain[i][j] >snowMountain[x][y]){ f[i][j]=maxOfTwo(f[i][j],find(snowMountain,f,x,y,r,c)+1); } } returnf[i][j]; }main函数
intmain(){ ifstreamfin("a.in"); ofstreamfout("a.out"); inti,j,r,c,maxHeight=0; fin>>r>>c; vector<vector<int>>snowMountain(r,vector<int>(c,0)); vector<vector<int>>f(r,vector<int>(c,-1)); for(i=0;i< r; i++) for(j=0;j< c; j++) fin >>snowMountain[i][j]; for(i=0;i< r; i++) for(j=0;j< c; j++) { maxHeight = maxOfTwo(maxHeight, find(snowMountain, f, i, j, r, c)); } fout << maxHeight << endl; fin.close(); fout.close(); return0; } 06 总结记忆化搜索是一种非常实用的算法,因为深搜用递归很容易实现,记忆化又避免了重复子问题的计算,提高了运行效率。 这其实就是动态规划的思想,常见的动态规划用递推实现,相比记忆化搜索实现上会更难一点,而记忆化搜索就没有这个问题。 算法的适用场景也需要根据具体的问题来分析,一般常用在地图或者树型结构中。 审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
算法
+关注
关注
23文章
4762浏览量
97176 -
代码
+关注
关注
30文章
4942浏览量
73168
原文标题:啥是记忆化搜索?
文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
指令集测试的一种纠错方法
本文描述在进行指令集测试的一种纠错方法
1.打开测试指令集对应的dump文件
dump文件是指由汇编文件进行反汇编之后,可以供人阅读指令的反汇编文件。其包含了每一条指令的具体操作的信息。指令集测试
发表于 10-24 14:04
京东:利用商品管理API自动调整商品上下架状态,优化搜索排名
京东:利用商品管理API自动调整商品上下架状态,优化搜索排名 在电商运营中,高效管理商品状态是提升销售的关键。京东作为领先的电商平台,提供了强大的商品管理API,允许商家通过编程方式自动化操作
产品搜索与过滤API接口
这些功能。本文将详细介绍其原理、设计实现和实际应用,帮助您逐步构建可靠的API系统。 1. 什么是产品搜索与过滤API接口 产品搜索与过滤API接口是一种基于HTTP的接口,允许客户端发送请求来查询产品数据,并根据特定条件筛选结
根据标题利用API优化电商搜索功能:提升转化率
在电商平台中,搜索功能是用户发现商品的核心入口。一个高效的搜索系统不仅能提升用户体验,还能显著提高转化率——即用户从搜索到实际购买的比率。然而,传统
一种高效智能的光伏电站管理平台
储一体化(集成多种储能管理功能等)。用户根据自身场景和需求,选择合适光伏电站管理平台及功能应用配置,从而实现发电效率最大化、运维成本最小化及碳中和目标。 光伏电站管理平台作为一种智能光伏管理系统,通过光伏智能管理
一种环保型红色发烟弹主装药配方设计与优化
(DSC)的功能,能够在同一实验条件下同时获得样品的质量变化和热流信息。一种环保型红色发烟弹主装药配方设计与优化【(1、武警工程大学研究生大队2、武警工程大学装备
无刷直流电机滑模观测器参数优化设计方法
摘要:滑模反电势观测器的增益参数会影响观测器的收敛速度以及动态响应性能,常见的设计方法是基于观测器稳定性理论进行设计。提出一种利用遗传算法在稳定域内搜索观测误差最小的增益参数的新方法,
发表于 06-27 16:48
汉思新材料取得一种PCB板封装胶及其制备方法的专利
汉思新材料取得一种PCB板封装胶及其制备方法的专利汉思新材料(深圳市汉思新材料科技有限公司)于2023年取得了一项关于PCB板封装胶及其制备方法的发明专利(专利号:CN20231015
一种分段气隙的CLLC变换器平面变压器设计
气隙设计的优点。
目录1 概述2 一种分段气隙的CLLC平面变压器设计3 实验验证4 参考文献
1 概述学者们从LLC拓扑原理、新型器件、改进拓扑、先进调制方法、谐振参数优化方法、磁性
发表于 03-27 13:57
一种永磁电机用转子组件制作方法
一种永磁电机所使用的转子组件,是由磁钢与芯轴组装而成,产品工作转速80 000 r /mi n,磁钢相对于芯轴的同轴度要小于O.015 mm。现有的装配方法是:先在芯轴两端面制作中心孔,然后直接
发表于 03-25 15:20
VirtualLab Fusion应用:参数优化文档介绍
局部优化算法和一种全局优化算法。
参数优化文档
可以为光学装置生成参数优化文档,该光学装置通过探测器或分析仪输出要
发表于 02-28 08:44
Kaggle知识点:7种超参数搜索方法
数据科学超参数搜索确实是机器学习生命周期中不可或缺的一步,特别是在模型性能方面。正确的超参数选择可以显著提高模型的准确性、对未见数据的泛化能力以及收敛速度。不当的超参数选择可能导致过拟合或欠拟合等
光波导系统中光栅几何结构的优化
Fusion为这项任务提供了一系列强大的工具,如:可以计算基本优化函数(如均匀性和效率)的探测器,以及沿着布局的特定区域实现光栅参数平滑变化的可能性。后一种方法可大大减少优化中自由参
发表于 12-16 10:39

一种优化的方法:记忆化搜索
评论