记忆化搜索算法

记忆化搜索算法概述记忆化搜索算法事实上是一种对递归算法的优化因为在递归算法中有很多重复计算,导致了非常离谱的时间和空间复杂度所以我们采用记住计算结果的方式,能很大程度上减少复杂度例题1AcWing901.滑雪例题2AcWing2067.走方格…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

概述

记忆化搜索算法事实上是一种对递归算法的优化
因为在递归算法中有很多重复计算,导致了非常离谱的时间和空间复杂度
所以我们采用记住计算结果的方式,能很大程度上减少复杂度

算法核心结构

此算法可以被抽象成为以下的结构:

f(problem p){ 
   
    if(p has been solved){ 
   
         return the result
    }else{ 
   
         divide the p into some sub-problems (p1, p2, p3...)
         f(p1);
         f(p2);
         f(p3);
         ...
    }

例题1 AcWing 901. 滑雪

十分典型的记忆化搜索题目,主要体现在if(f[x][y]!=-1) return f[x][y];上。

#include<iostream>
#include<cstring>
using namespace std;

const int N=304;

int r,c;
int f[N][N];
int g[N][N];
int dx[]={ 
   0,-1,0,1},dy[]={ 
   -1,0,1,0};

int dp(int x,int y)
{ 
   
	if(f[x][y]!=-1) return f[x][y];
	
	f[x][y]=1;
	for(int i=0;i<4;i++)
	{ 
   
		int xi=x+dx[i],yi=y+dy[i];
		if(xi>=1&&xi<=r&&yi>=1&&yi<=c&&g[xi][yi]<g[x][y])
			f[x][y]=max(f[x][y],dp(xi,yi)+1);
	}
	
	return f[x][y];
}

int main()
{ 
   
	cin>>r>>c;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			cin>>g[i][j];
	
	memset(f,-1,sizeof(f));
	
	int res=0;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			res=max(res,dp(i,j));
		
	cout<<res;
	return 0;
}

例题2 AcWing 2067. 走方格

第十一届蓝桥杯省赛原题,除了记忆化搜索方法,还有正常dp方法可供选择。

#include<iostream>
using namespace std;

const int N=32;
int n,m;
int f[N][N];

int dfs(int x,int y)
{ 
   
	if(x&1||y&1)
	{ 
   
		if(f[x][y]) return f[x][y];
		if(x<n) f[x][y]+=dfs(x+1,y);
		if(y<m) f[x][y]+=dfs(x,y+1);
	}
	return f[x][y];
}

int main()
{ 
   
	cin>>n>>m;
	f[n][m] = n & 1 || m & 1;//判断nm是否同为偶数
	cout<<dfs(1,1);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164443.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pytest parametrize fixture_参数化方法

    pytest parametrize fixture_参数化方法前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

    2022年7月30日
    6
  • img 转化成iso镜像的办法「建议收藏」

    img 转化成iso镜像的办法「建议收藏」最近在使用KVM启用虚拟机,然后将里面的环境和配置配置成我们公司需要的环境,再打包成iso镜像,之后再次生成新的虚拟机。但是KVM启动出的镜像生成的是img镜像,需要将img镜像转换成iso镜像

    2022年8月3日
    6
  • 一些能用的 BT Tracker 服务器地址【不定时更新】[通俗易懂]

    一些能用的 BT Tracker 服务器地址【不定时更新】[通俗易懂]不定时更新可用的BTTracker服务器列表(BTTrackerList);相关工具BEncodeEditor:https://sites.google.com/site/ultimasites/bencode-editorTrackerEditor:https://github.com/GerryFerdinandus/bittorrent-tracker-editor/releases可以将服务器列表写入TrackerEditor程序同目录下的add_trackers.txt

    2022年6月18日
    153
  • 单片机控制步进电机

    单片机控制步进电机简介:用单片机控制步进电机正转反转加速减速;由LCD1602实时显示步进电机的状态;F-正转,B-反转;数字越大,转速越大;仿真原理图如下:MCU和LCD1602显示模块:ULN2803驱动和步进电机模块:C语言代码如下:/*—————————–FileName:StepperMotor.hFunction:函数头文件Autho…

    2022年6月1日
    32
  • 敏捷项目管理的流程_敏捷开发项目管理方法

    敏捷项目管理的流程_敏捷开发项目管理方法引言:敏捷绝非某一种特定的开发方法,它只是一种应对快速变化的需求的一种软件开发能力。敏捷本身只包含了《敏捷软件开发宣言》和《敏捷软件的十二条原则》两份文档。敏捷的起源:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。目前很多互联网公司都在搞或者想

    2025年6月22日
    3
  • Centos 7安装nginx并配置https[通俗易懂]

    Centos 7安装nginx并配置https[通俗易懂]1.更新yum源yumupdate2.安装nginx的依赖环境yuminstall-ygcc-c++pcrepcre-develzlibzlib-developensslopenssl-develgcc-c++:安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境。pcrepcre-devel:PCRE(PerlCompatible…

    2022年5月26日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号