记忆化搜索算法

记忆化搜索算法概述记忆化搜索算法事实上是一种对递归算法的优化因为在递归算法中有很多重复计算,导致了非常离谱的时间和空间复杂度所以我们采用记住计算结果的方式,能很大程度上减少复杂度例题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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • strictmode android,Android中的StrictMode

    strictmode android,Android中的StrictModeStrictMode.ThreadPolicypublicstaticfinalclassStrictMode.ThreadPolicyextendsObjectjava.lang.Object↳android.os.StrictMode.ThreadPolicy介绍StrictMode是Android2.3(API9)中引入的一个工具类,继承自Object,它可以检测代码中的一…

    2022年5月29日
    31
  • 你的账户被停用,请向系统管理员咨询_win10退出管理员账户

    你的账户被停用,请向系统管理员咨询_win10退出管理员账户当你的电脑误操作了以下步骤,或者被篡改了设置了这里那恭喜你,重启后就登不上Administrator账户了首先看一下网上的两种无效方式无效方式一:带命令符的安全模式一般两种方式进入安全模式:方式一:F8进入方式二:按住shift重启cmd中输入netuseradministrator/active:yes亲测无效,依然登录不进去无效方式二:PE进入设置用户和组…

    2022年10月26日
    0
  • 二叉树的五个性质「建议收藏」

    二叉树的五个性质「建议收藏」性质1:在二叉树的第i层上最多有2^(i-1)个结点(i≥1)。第一层是根结点,只有一个,所以2(1-1)=20=1。第二层有两个,2(2-1)=21=2。第三层有四个,2(3-1)=22=4。第四层有八个,2(4-1)=2^3=8。性质2:深度为k的二叉树至多有2^k-1个结点(k≥1)。注意这里一定要看清楚,是2k后再减去1,而不是2(k-1)。以前很多同学不能完全理解,这样去记忆,就容易把性质2与性质1给弄混淆了。深度为k意思就是有k层的二叉树,我们先来看看简单的。如果有一层,至多1=

    2022年5月31日
    40
  • 关于MAC安装Pycharm的总结「建议收藏」

    关于MAC安装Pycharm的总结「建议收藏」关于MAC安装Pycharm的总结昨天,我根据微信公众号里的Mac软件管家下载安装一个Pycharm,我下载的是最新版本的(2019那款),是简体中文版。下载链接:pan.baidu.com/s/1R7j0tQ5EEqAWZjP_tmz5VQ提取码:cixh大家也可以自行关注那个公众号下载你所要滴!但是我在最后激活的时候遇到了一点小麻烦,如下图所示:然后我找到了一些方法去解决,希望…

    2022年8月26日
    5
  • 通用目标检测_ug目标体完全处于工具体内部

    通用目标检测_ug目标体完全处于工具体内部睿智的目标检测-番外篇——数据增强在目标检测中的应用学习前言数据增强做了什么学习前言数据增强是非常重要的提高目标检测算法鲁棒性的手段,学习一下对身体有好处!数据增强做了什么…

    2022年10月10日
    0
  • Windows 10 安装程序_ubuntu20.04安装cuda

    Windows 10 安装程序_ubuntu20.04安装cudaWindows10安装CUDAToolkit10.10.NVCUDA.DLL-NVIDIACUDA10.1.135driver-NVIDIA驱动程序版本NVIDIA控制面板->帮助->系统信息->组件1.CUDAToolkitCUDAToolkithttps://developer.nvidia.com/cuda-toolkitCUDAToolkitDownloadhttps://developer.nvidia.com/

    2022年9月16日
    0

发表回复

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

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