对记忆化搜索(ms)和动态规划(dp)的深入理解

    六月中旬了,马上就要期末考试了,期末考试结束以后就要迎来紧张刺激的留校集训,到那时博客会更新的比较频繁,而现在在准备期末考试,所以可能更新的博客稍微少一些。

    话不多说,今天来更一篇刚刚吃饭的时候关于记忆化搜索和动态规划的一些区别的思考。

    记忆化搜索(Memory Search),其实还是用递归函数实现的,通常函数名依然叫做dfs(  ̄□ ̄||)。核心语句就是那两部分关键的语句块啦。

        1.函数一开始的判断出口:if(搜索过) return 数组中的值。因为这里涉及到是否搜索过,所以一般将数组初始化为-1,详情见那道经典的滑雪题目:链接稍后送上。那道滑雪题,也可以用dp解,他俩的区别和解题的不同一会博客中也会有提到。

        2.函数的递归前进语句:return fib[i]=fib[i-1]+fib[i-2];(没有具体的例子实在不好说了,所以这里用fib数列来做演示)。

这样就做到了数组的每个值只计算了一次,不会有多余的时间消耗。

还有一点!记住ms型dfs就必须是int型的了!! 不要在用bool或者void了!

下面送上记忆化搜索的fib求解的部分代码:

#include<iostream>
using namespace std;
const int MAX = 10000+5;
int fib[MAX];
int dfs(int n) {// if(fib[n]!=-1) return fib[n];return fib[n]=dfs(n-1)+dfs(n-2);}
int main()
{fib[1]=fib[2]=1;for(int i = 2; i<MAX; i++) {fib[i]=-1;}dfs(MAX-1);//别写成了MAX,那样输出的全是-1 for(int i = 1; i<=50; i++) {printf("%d ",fib[i]);if(i%5==0) { printf("\n"); }}return 0 ;} 

输出结果:

1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
10946 17711 28657 46368 75025
121393 196418 317811 514229 832040
1346269 2178309 3524578 5702887 9227465
14930352 24157817 39088169 63245986 102334155
165580141 267914296 433494437 701408733 1134903170
1836311903 -1323752223 512559680 -811192543 -298632863
从中也容易看出来,fib数列增长还是很快的!(通项可以用母函数表示出来!但是目前对母函数尚未学精,暂不做讨论)


下面是一个很值特研究的问题:

为什么说能用dp的都能用ms,但是反之不立。(至少我是这么认为的)

在fib中,你会发现写记忆化搜索像个傻子一样自取麻烦,直接dp递推多简单,多此一举。但之所以在fib中ms和dp如此相似是因为fib的顺序是固定的!有规律的!所以体现不出ms的用处来!

再看一道题比如滑雪,你如果用dp,必须要排序!然后按照排序的顺序(那道题是按照高度排序的)从小到大递推!原因也很简单,因为dp[i][j]可能需要用到四周的值!且dp有个特点,我既然要用你,那么你的值,比如要是已经确定的值(就是不会再更新这个值了),我给他取个名叫完成值,并给他一个特点,那就是,你如果是完成值,那么你将不会再被更新了,也就是,对这个数据,只有读的功能,没有写的功能。也就是说,比如if(i,j右边那个点的高度(即i,j+1)<当前i,j坐标的高度),那么更新dp[i][j],并且dp[i][j]也是完成值了!(通过判断是不是-1来确定是否是完成值,因为最开始初始化成-1),而如果i,j右边那个点的高度(即i,j+1)<当前i,j坐标的高度,那就无所谓i,j+1是不是完成值了,,,反正你也不去读这个数据(刚刚说过了对完成值只能读不能写!)所以你需要用到的值,都是高度比你小的值,这也是为什么需要进行按照高度从小到大进行排序,并且递推的时候,只能按照这个顺序进行递推!

上面一段是你如果用dp的情况,而如果你用的是ms,情况将没这么复杂,不需要排序!不需要按照一定顺序递推!而只需要上面提到的两条关键的语句块,就解决的所有事情!具体还是需要自己体会的。、。。

下面贴上滑雪的ms代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;int r,c;
int maze[105][105];
int dp[105][105];
void init () {for(int i = 1; i<=104 ; i++) {for(int j = 1 ; j<=104 ; j++) {dp[i][j]=-1;}}
}
bool ok(int x,int y){if(x<=r&&x>0&&y<=c&&y>0) return true;else return false;
} 
int dfs(int x,int y) {if(dp[x][y]!=-1) {return dp[x][y];}
//	if(x==0||y==0) return 0 ;int flag=0;int next[4]={0,0,0,0};if(maze[x+1][y]<maze[x][y]&&ok(x+1,y)) {next[0]=dfs(x+1,y);flag=1;}if(maze[x][y+1]<maze[x][y]&&ok(x,y+1)) {next[1]=dfs(x,y+1);flag=1;}if(maze[x-1][y]<maze[x][y]&&ok(x-1,y)) {next[2]=dfs(x-1,y);flag=1;}if(maze[x][y-1]<maze[x][y]&&ok(x,y-1)) {next[3]=dfs(x,y-1);flag=1;}if(flag==0) return dp[x][y]=0;return dp[x][y]=1+*max_element(next,next+4);
}
int main()
{cin >> r>>c;int maxx=0;init();for(int i=1; i<=r; i++) {for(int j = 1 ; j<=c ; j++) {scanf("%d",&maze[i][j]);}}for(int i=1; i <= r ; i++) {for(int j = 1 ; j <= c ; j++) {maxx=max(maxx,dfs(i,j));}}cout << maxx+1<<endl;return 0 ;} 


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

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

相关文章

史密斯圆图的使用

史密斯圆图的使用 简介识别史密斯圆图等反射系数圆归一化阻抗圆导纳圆图史密斯圆图的使用单支匹配双支匹配简介 史密斯图Smith Chart是电气工程,无线电,射频工程,微波工程和通信等领域常用的一种图示工具,用于分析和设计传输线和阻抗匹配网络,它由美国工程师Phillip H.Sm…

html5触边反弹,第四章课件.PPT_数字电子技术基础(ppt课件)_ppt_大学课件预览_高等教育资讯网...

第 4章 触发器电路授课计划教学内容教学小结一、授课计划1、教学目标1,熟练掌握基本 RS触发器的工作原理,逻辑功能, 及钟控 RS触发器, JK触发器,D触发器的逻辑功能, 时间波形图, 特性方程 。2,理解钟控 RS触发器, JK触发器, D触发器电路的工作原理, 特点, 相互之间的转换及常用…

一发模拟水题但是RE,暑假抽个时间改一改、、

这是我们实验室纳新考试的A题&#xff0c;简单模拟。 话不多说上题干&#xff1a;哲哲晔晔很难受Description哲哲和晔晔最喜欢一起睡懒觉了&#xff01;可老师又特别喜欢点名&#xff0c;所以每个第一节有课的早晨&#xff0c;他们都会很难受。因为起床太晚了他们每次都要跑着去…

莆田学院计算机科学与技术分数,莆田学院录取分数线2021是多少分(附历年录取分数线)...

莆田学院录取分数线2020是多少分&#xff0c;各专业录取分数线是多少&#xff0c;是每个填报莆田学院的考生最关注的问题&#xff0c;随着各省高考录取批次相继公布&#xff0c;考生也开始关心是否被录取&#xff0c;本站小编整理相关信息供参考&#xff0c;仅供参考。一、莆田…

一道水的不能再水的题目

Description一个n&#xff0c;代表一共有多少个数&#xff0c;接下来给你n个数&#xff0c;让你求一个m&#xff0c;使得前m个数的和大于等于n个数总和的一半.Input一个n&#xff08;0<n<10000&#xff09;代表一共有多少个数&#xff0c;接下来n个数&#xff08;1~300&a…

w7系统计算机e盘无法打开,Win7电脑磁盘打不开怎么办

Win7系统电脑磁盘出现异常&#xff0c;不管是C盘、D盘还是E盘都打不开&#xff0c;并且还出现“位置不可用 无法访问 E&#xff1a;\ 拒绝访问”的提示。那么Win7磁盘打不开怎么办呢?下面是学习啦小编给大家整理的一些有关Win7电脑磁盘打不开的解决方法&#xff0c;希望对大家…

快速幂模板

最近准备期末考试有点枯燥&#xff0c;&#xff0c;就更新点水题上来或者模板上来啦&#xff0c;也算是整理一下实验室电脑的文件&#xff0c;&#xff0c;太多太杂了。 模板如下&#xff1a;&#xff08;等暑假开始了&#xff0c;我再把矩阵快速幂的模板放上来&#xff09; #i…

培智计算机教学论文,【培智数学论文】_培智数学教学论文

课件架桥,点亮思维——谈多媒体在培智数学教学中的有效运用随着素质教学改革的深入,课堂教学模式也逐步从传统单一的教授式转入到创新多元化的探究式.教师,也逐步从传道者转化为引领者,学生,更是从课堂的配角转化为探究的主体.新型的教学模式,需要更先进的教学手段介入.而信息化…

快期末考试了好烦躁啊来写点东西

最近是真的烦躁&#xff0c;&#xff0c;偶然的机会加了一个四非保研群&#xff0c;无数次的感受到了这个世界对非985非211学校的歧视&#xff0c;而你对此只能无奈&#xff0c;却无能为力。里面说了很多考研的途径和一些需要注意的事情&#xff0c;比如九推啊夏令营啊等等新名…

大学计算机二级培训蹭课,本人在复旦大学蹭课总结的一点小小的经验

1、尽量早点去蹭课&#xff0c;因为会有很多复旦的学生去占座&#xff0c;特别是专业课上他们的到座率很高,所以最好群里面约好了结伴同行&#xff0c;这样的话&#xff0c;谁先到就可以给同伴占个座了;2、去的时候尽可能穿得像个学生&#xff0c;带几本相关的书&#xff0c;毕…

距离高考出成绩,一年了、、、

去年2017.6.24日&#xff0c;下午4点&#xff0c;怀着紧张的心情&#xff0c;&#xff0c;&#xff0c;查看了自己的高考分数。 今年2017.6.24日&#xff0c;下午4点&#xff0c;不知道为什么&#xff0c;同样心里怦怦直跳。 一年了啊&#xff0c;进入大学&#xff0c;选择cs专…

计算机采购类增值税税率是多少,各个行业的税率是多少?

关于税收的种类&#xff0c;楼下税里税外 的回答非常全面。因为2018年的增值税率调整&#xff0c;我重点再说说调整后各行业的增值税税率&#xff0c;并比较下小规模和一般纳税人的税率的差别。也许对各位老板朋友有帮助。增值税的税率可以分为两类税率(4种)&#xff1a;16%&am…

据说200G网盘资料

来源&#xff1a;HACK学习呀2015cracer入侵入门到精通视频教程点我查看trf3一笔√带过入侵教程点我查看ypan〔复仇者〕新手入门系列(7套)点我查看g1tb菜鸟入门&#xff0c;做的确实不错点我查看q0oh菜鸟基础(10套)点我查看2zq6小迪渗透第十期点我查看u5sv计算机网络点我查看v14…

新出计算机语言有哪些,2020年最新编程语言排名(十大编程语言的比较)

2020年最新几天前&#xff0c;编程语言社区TIOBE最近发布了三月份的编程语言排名.在最新的编程语言排名中&#xff0c;前5名排名没有明显变化. 但是&#xff0c;与以前的报告相比&#xff0c;最受欢迎的开发人员仍然是Java 8和Java 11.十大编程语言排名此外&#xff0c;在上个月…

51nod 1091 重叠的线段(贪心)

题干&#xff1a; X轴上有N条线段&#xff0c;每条线段包括1个起点和终点。线段的重叠是这样来算的&#xff0c;[10 20]和[12 25]的重叠部分为[12 20]。 给出N条线段的起点和终点&#xff0c;从中选出2条线段&#xff0c;这两条线段的重叠部分是最长的。输出这个最长的距离。如…

计算机编程老鸟的心得,java入门123——一个老鸟java学习心得.docx

java入门123——一个老鸟的java学习心得学习Java心得体会  学习了一学期的Java课程,觉得是该总结自己的心得体会了。开始学习任何一门课(包括java)&#xff0c;兴趣最重要。一直觉得自己在学计算机编程语言&#xff0c;学习了很多&#xff0c;但每门语言都停留在知识边缘地带…

HDU 3785 寻找大富翁(sort排序或优先队列)

题干&#xff1a; 浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. Input输入包含多组测试用例. 每个用例首先包含2个整数n&#xff08;0<n<100000&#xff09;和m(0<m<10)&#xff0c;其中: n为镇上的人数&#xff0c;m为需要找出的大富翁数, 接下来一行输入…

杭州软件测试培训有用吗,杭州软件测试培训靠谱吗

小白也能学会的模拟屏幕滑动与手势密码绘制 - 51Testing软件测试网小白也能学会的模拟屏幕滑动与手势密码绘制发表于&#xff1a;2019-8-13 13:32 作者&#xff1a;linux超 来源&#xff1a;博客园前言  App自动化测试中有两个很重要的操作&#xff0c;屏幕滑动与绘制手势…

priority_queue(优先队列)的简单构造与用法

priority_queuepriority_queue 优先队列&#xff0c;其底层是用堆来实现的。在优先队列中&#xff0c;队首元素一定是当前队列中优先级最高的那一个。在优先队列中&#xff0c;没有 front() 函数与 back() 函数&#xff0c;而只能通过 top() 函数来访问队首元素&#xff08;也可…

局域网服务器文件夹隐藏,局域网服务器共享文件夹访问权限设置win7隐藏无权限共享文件夹方法.docx...

局域网服务器共享文件夹访问权限设置win7隐藏无权限共享文件夹方法??局域网服务器共享文件夹访问权限设置、win7隐藏无权限共享文件夹的方法在局域网文件管理中&#xff0c;文件服务器共享文件的管理一直是当前网络管理的重要工作。尤其是很多单位的服务器共享文件常常是单位…