前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记忆化搜索算法

记忆化搜索算法

作者头像
全栈程序员站长
发布2022-09-17 10:38:48
4050
发布2022-09-17 10:38:48
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

概述

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

算法核心结构

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

代码语言:javascript
复制
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];上。

代码语言:javascript
复制
#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方法可供选择。

代码语言:javascript
复制
#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.cn/164443.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
    • 算法核心结构
    • 例题1 AcWing 901. 滑雪
    • 例题2 AcWing 2067. 走方格
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档