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文章
4601浏览量
92703 -
代码
+关注
关注
30文章
4758浏览量
68392
原文标题:啥是记忆化搜索?
文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
一种创新的动态轨迹预测方法
本文提出了一种动态轨迹预测方法,通过结合历史帧和历史预测结果来提高预测的稳定性和准确性。它引入了历史预测注意力模块,以编码连续预测之间的动态关系,并通过三重因子注意力模块实现了最先进的性能。本方法能够生成准确且稳定的未来轨迹,这
一种无透镜成像的新方法
使用OAM-HHG EUV光束对高度周期性结构进行成像的EUV聚光显微镜 为了研究微电子或光子元件中的纳米级图案,一种基于无透镜成像的新方法可以实现近乎完美的高分辨率显微镜。 层析成像是一种强大的无
机械自动化是自动化的一种吗
引言 自动化技术是指利用控制装置对生产过程进行控制,以实现生产过程的自动化。机械自动化是自动化技术的一种,它主要涉及到使用机械设备和控制系统
一种利用光致Lamb波对微米级颗粒进行大通量操控的光声图案化方法
近日,北京理工大学李锋教授联合华南理工大学李志远教授与中央民族大学郭红莲教授提出了一种利用光致Lamb波在空气中对微米级颗粒进行大通量操控的光声图案化方法。
什么电路具有记忆功能 时序电路是不含有记忆功能的器件对吗
触发器等特定的电路元件来实现记忆功能。以下会详细介绍几种具有记忆功能的电路。 1. 存储器:存储器是一种具有记忆功能的电路元件,用于存储和检索数据。存储器可以分为随机存取存储器(RAM
谷歌搜索引擎优化的各个方面和步骤
谷歌搜索引擎是最受欢迎和广泛使用的搜索引擎之一,为了使你的网站在谷歌上更好地排名并提高曝光度,你可以采取一些谷歌搜索引擎
一种八腔带通腔体滤波器的设计方法
摘 要: 介绍了一种八腔带通腔体滤波器的设计方法。结合仿真软件SuperFilter与Ansoft HFSS的三维场仿真,能极大减少设计微波腔体滤波器的时间和成本。通过对模型的仿真和优化,最终设计出来的滤波器实验测试结果与仿真结
一种产生激光脉冲新方法
等离子体中脉冲压缩的概念 英国和韩国的科学家提出了一种产生激光脉冲的新方法,其功率是现有激光脉冲的1000多倍。 科学家们使用计算机模拟联合研究,展示了一种压缩光的新方法,以充分提高光
一种涡扇发动机转子转速信号及高齿信号测量方法
航空发动机工作状态的变化多数情况都伴随着发动机转速的变化,转速直接与经过发动机的流量及推力联系在一起,因此转速信号的采集显得十分重要。鉴于此,提出了一种高可靠转速信号及高齿信号采集的方法,使用信号
评论