记忆化搜索的应用

记忆化搜索的应用

一般来说,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。

如何协调好动态规划的高效率与高消费之间的矛盾呢?有一种折中的办法就是记忆化算法。记忆化算法在求解的时候还是按着自顶向下的顺序,每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有使用价值的。

举一个例子:如右图所示是一个有向无环图,求从顶点1到顶点6的最长路径。(规定边的方向从左到右)

我们将从起点(顶点1)开始到某个顶点的最长路径作为状态,用一维数组opt记录。Opt[j]表示由起点到顶点j时的最长路径。显然,opt[1]=0,这是初始状态,即动态规划的边界条件。于是,我们很容易地写出状态转移方程式:opt[j]=max{opt[k]+a[k,j]}(k到j有一条长度为a[k,j]的边)。虽然有了完整的状态转移方程式,但是还是不知道动态规划的顺序。所以,还需要先进行一下拓扑排序,按照排序的顺序推下去,opt[6]就是问题的解。

可以看出,动态规划相比搜索之所以高效,是因为它将所有的状态都保存了下来。当遇到重复子问题时,它不像搜索那样把这个状态的最优值再计算一遍,只要把那个状态的最优值调出来就可以了。例如,当计算opt[4]和opt[5]时,都用到了opt[3]的值。因为已经将它保存下来了,所以就没有必要再去搜索了。

但是动态规划仍然是有缺点的。一个很突出的缺点就是要进行拓扑排序。这道题的拓扑关系是很简单的,但有些题的拓扑关系是很复杂的。对于这些题目,如果也进行拓扑排序,工作量非常大。遇到这种情况,我们可以用记忆化搜索的方法,避免拓扑排序。

【例】滑雪

【问题描述】

小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡。滑坡的长度由滑过点的个数来计算,区域由一个二维数组给出,数组的每个数字代表点的高度。下面是一个例子:

1     2     3     4     5

16    17    18    19    6

15    24    25    20    7

14    23    22    21    8

13    12    11    10    9

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小,在上面的例子中,一条可行的滑坡为25-24-17-16-1(从25开始到1结束),当然25-24……2…1更长,事实上这是最长的一条。

【输入格式】

输入的第一行为表示区域的二维数组的行数R和列数C(1≤R、C≤100),下面是R行,每行有C个数代表高度。

【输出格式】

输出区域中最长的滑坡长度。

【输入样例】ski.in

5      5

1      2     3     4     5

16    17    18    19    6

15    24    25    20    7

14    23    22    21    8

13    12    11    10    9

【输出样例】ski.out

25

【算法分析】

由于一个人可以从某个点滑向上下左右相邻四个点之一,如上图所示。当且仅当高度减小,对于任意一个点[i,j],当它的高度小于与之相邻的四个点([i-1,j], [i,j+1], [i+1,j], [i,j-1])的高度时,这四个点可以滑向[i,j],用f[i,j]表示到[i,j]为止的最大长度,则f[i,j]=max{f(i+a,j+b)}+1,其中坐标增量{(a,b)=[(1,0),(-1,0),(0,1),(0,-1)],0<i+a<=r,0<j+b<=c,High[i,j]<High[i+a,j+b]}。为了保证满足条件的f[i+a,j+b]在f[i,j]前算出,需要对高度排一次序,然后从大到小规划(高度)。最后再比较一下所有f(i,j){0<i≤r,0<j≤c},找出其中最长的一条路线。我们还可以用记忆化搜索的方法,它的优点是不需进行排序,按照行的顺序,利用递归逐点求出区域中到达此点的最长路径,每个点的最长路径只求一次。

 1 const
 2   dx:array[1..4] of shortint=(0,-1,0,1);    {x的坐标增量}
 3   dy:array[1..4] of shortint=(-1,0,1,0);    {y的坐标增量}
 4 var
 5   r,c,ans,anss:longint;
 6   map,f:array[1..100,1..100] of longint; 
 7 procedure init;
 8 var i,j:longint;
 9 begin
10   readln(r,c);
11   for i:=1 to r do
12    for j:=1 to c do
13     read(map[i,j]);                   {读入每个点的高度}
14   ans:=0; anss:=0;
15   fillchar(f,sizeof(f),0);
16 end;
17 function search(x,y:longint):longint;           {函数的作用是求到[x,y]点的最长路径}
18 var i,j,nx,ny,tmp,t:longint;
19 begin
20   if f[x,y]>0 then   {此点长度已经求出,不必进行进一步递归,保证每一个点的最大长度只求一次,这是记忆化搜索的特点}
21    begin
22      search:=f[x,y]; exit;
23    end;
24   t:=1;
25   for i:=1 to 4 do                      {从四个方向上搜索能达到[x,y]的点}
26    begin
27      nx:=x+dx[i]; ny:=y+dy[i];               {新坐标}
28      if (1<=nx)and(nx<=r) and (1<=ny)and(ny<=c)    {边界限制}
29                       and (map[nx,ny]>map[x,y])    {高度比较}
30       then
31        begin
32          tmp:=search(nx,ny)+1;              {递归进行记忆化搜索}
33          if tmp>t then t:=tmp;
34        end;
35    end;
36   f[x,y]:=t;
37   search:=t;
38 end;
39 procedure doit;
40 var i,j:longint;
41 begin
42   for i:=1 to r do               {按照行的顺序,利用递归逐点求出区域中到达此点的最长路径}
43    for j:=1 to c do
44      begin
45        anss:=search(i,j);
46        //f[i,j]:=anss;
47        if anss>ans then ans:=anss;          {寻找最大长度值}
48      end;
49 end;
50 procedure outit;
51 var i,j:longint;
52 begin
53   {for i:=1 to r do begin
54    for j:=1 to c do
55     write(f[i,j],' '); writeln; end;}
56   writeln(ans);
57 end;
58 begin
59   init;
60   doit;
61   outit;
62 end.

 

转载于:https://www.cnblogs.com/vacation/p/6071586.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Veebot-自动静脉抽血机器人

Veebot-自动静脉抽血机器人 我们可能都有过被抽血的经验。护士让你握紧拳头&#xff0c;用一根橡皮条压住你上臂的血管&#xff0c;在你的肘部内侧寻找你的静脉&#xff0c;有时还需要拍打几下&#xff0c;摸到隆起的静脉血管&#xff0c;一针下去。有时候碰到技术好的护士&…

idea 转普通项目为maven 项目

1、项目上右键 Add Framework Support。 2、选择maven&#xff0c;点击OK。 转载于:https://www.cnblogs.com/mayanze/p/8042489.html

【深度学习之ResNet】——深度残差网络—ResNet总结

目录 论文名称&#xff1a;Deep Residual Learning for Image Recognition 摘要&#xff1a; 1、引言 2、为什么会提出ResNet残差网络呢&#xff1f; 3、深度残差网络结构学习&#xff08;Deep Residual learning&#xff09; &#xff08;1&#xff09;残差单元 &#xf…

关于SafeMove White Paper功能

ABB机器人网站有一个 Safemove 功能的介绍&#xff0c;在Overview页面右半版有一篇文档是 SafeMove White Paper &#xff0c;在45页的 pdf 文档中&#xff0c;详细了介绍工业机器人的安全原则&#xff0c;以及ABB工业机器人自身 EPS (Electronic Position Switches) 和 SafeMo…

面试疑难点解析

List,Set,Map,有什么区别&#xff1f; List和Set实际上市实现了Collection接口&#xff0c;那么Collection接口的原理你能简单描述一下吗&#xff1f; List接口可以插入多个NULL值&#xff0c;并且重复值&#xff0c;而且LIST是一个有序的集合。 Set是一个不可重复的集合&#…

主机无法访问虚拟机的httpd服务

症状&#xff1a;虚拟机装的centos6.3 通过桥接的方式与主机连接 虚拟机通过yum安装httpd服务 在主机浏览器中输入 虚拟机ip 无法访问虚拟机Apache 虚拟机和主机可以相互ping通 解决&#xff1a;关掉虚拟机的防火墙就可以了 命令setup进入防火墙管理 按空格键取消防火墙启用 转…

2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结

2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结 对“第二章 信息的表示和处理”的深入学习 这周的任务是选一章认为最重要的进行学习&#xff0c;我选择了第二章。当今的计算机存储和处理信息基本上是由二进制&#xff08;位&#xff09;组成&#xff0c;二进…

【VOC格式xml文件解析】——Python

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/4/26 12:49 # Author : linlianqin # Site : # File : test1.py # Software: PyCharm # description: import xml.etree.ElementTree as ETdef xmli(xmlpath):xmlTree ET.parse(xmlpath) # 解析xml文…

win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法

如上图所示&#xff0c;桌面或其他大部分地方点击右键菜单&#xff0c;都只显示一个白色框&#xff0c;鼠标移上去才有菜单项看&#xff0c;并且效果很丑 解决办法&#xff1a; 计算机—右键—属性—高级—性能—设置—视觉效果—淡入淡出或滑动菜单到视图&#xff0c;将其前面…

【setup.py编译出错】——提示无法查找到powershell.exe

https://www.cnblogs.com/wind-chaser/p/11359521.html pytorch fasterrcnn训练自己数据集文章链接 在进行faster rcnn pytorch跑通的时候遇到的&#xff0c;我是直接在pycharm中的终端上进行运行的&#xff0c;但是一直会跳出powershell.exe无法查找的错误&#xff0c; pytho…

同工不同酬,年薪 50 万美金的工程师到底有什么神本事?

同工不同酬&#xff0c;年薪 50 万美金的工程师到底有什么神本事&#xff1f;投递人 itwriter 发布于 2014-05-10 23:09 评论(6) 有6066人阅读 原文链接 [收藏] 英文原文&#xff1a;What kind of jobs do the software engineers who earn $500K a year do? 他们究竟是作…

艾里斑大小与像元尺寸的匹配问题

写给自己看的学习记录&#xff1a; 光具有波粒二象性&#xff0c;由此衍生出了几何光学与衍射光学。在光学设计软件中&#xff0c;最常用的判断标准是查看点列图的RMS半径以及MTF图的曲线&#xff0c;这两者分别代表了两种传播性质的评价方式。 在刚接触光学设计时&#xff0…

【mmdetection2.0错误】——ModuleNotFoundError: No module named ‘mmdet‘

一开始以为是安装包导入的相对路径的问题&#xff0c;结果鼓捣了一上午都没有用&#xff0c;最后才发现再进行mmdet2.0环境配置的时候忘记编译了 也就是如下语句&#xff1a; python setup.py develop

ABB RAPID 在 Notepad++ 中语法高亮的实现

ABB RAPID 在 Notepad 中语法高亮的实现 分类&#xff1a; Misc2014-04-08 15:43 145人阅读 评论(0) 收藏 举报notepadNotepad 内置了一个称为 UDL2.0 (User Defined Language) 的引擎&#xff0c;来实现用户自定义语法高亮&#xff0c;使用它&#xff0c;可以定制自己的代码语…

MyEclipse运行时自动保存

今天第一次用MyEclipse&#xff0c;我发现我的代码明明修改了&#xff0c;但运行结果发现总是修改前的代码结果。后来发现&#xff0c;是代码修改后必须保存&#xff0c;再点运行。这个功能明显不合适&#xff0c;所以需要更改MyEclipse的配置。红框是修改后的结果。 转载于:ht…

PLSQL中INDEX BY TABLE 的 prior 和 next 操作学习

开始 --INDEX BY Table SET SERVEROUTPUT ON;DECLARETYPE enm_tab_type IS TABLE OFemp.ename%TYPEINDEX BY BINARY_INTEGER;enm_table enm_tab_type; BEGINenm_table(1):1001;enm_table(2):1002;enm_table(3):1003;enm_table(4):1004;enm_table(6):1006;dbms_output.put_line(…

【深度学习torch——error】——“xxx.pt is a zip archive(did you mean to use torch.jit.load()?)

这个问题是在进行权重文件加载进行预测的时候发生的&#xff0c;原因其实就是torch版本不对 我是用的工作站训练使用的是torch1.7.0&#xff0c;然后用自己的电脑进行预测&#xff0c;就报错了&#xff0c;原因就是自己的电脑是torch1.2.0版本的 因为在1.6版本以上的模型改变…

如何写一个bootloader

声明&#xff1a;本文为学习Codeproject文章的个人总结性文章&#xff0c; 原文&#xff1a;http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part 本人开发环境&#xff1a; 操作系统&#xff1a;Ubuntu 32位&#xff08;64位的会有push…

定时执行某段程序

有时候我们需要每天 定时的 自动 去执行某段程序&#xff0c;那么这个功能如何实现呢&#xff1f; 经过百度&#xff0c;定时器就可以实现&#xff0c;总结如下&#xff1a; 我用控制台写了一个程序&#xff0c;用来在指定时间内 打印 “我执行了” 上面就是程序的运行结构&…

浅谈PROFINET IO通信的实时性

PROFINET由PROFIBUS国际组织&#xff08;PROFIBUS International&#xff0c;PI&#xff09;推出&#xff0c;是新一代基于工业以太网技术的自动化总线标准。作为一项战略性的技术创新&#xff0c;PROFINET为自动化通信领域提 供了一个完整的网络解决方案&#xff0c;囊括了诸如…