记忆化搜索(算法篇)

news2024/11/24 1:24:29

算法篇之记忆化搜索

记忆化搜索

概念

  • 记忆化搜索就是深度优先搜索的一种优化策略,记忆化搜索=深度优先搜索形式+动态规划思想
  • 由于dfs本质是暴力搜索,没有很好地处理重叠子问题,因此很低效
  • 记忆化算法在求解地时候还是按照自顶向下的顺序,但是每求解一个状态,就将它的解保存下来
  • 求解最优解问题

优点

  • 解决了深度优先搜索中的重叠子问题要多次遍历的问题
  • 搜索还可以剪枝,可能剪去大量不必要的状态

缺点

  • 对于同样的问题,如果用动态规划解决而是用了记忆化搜索会使得效率有所降低

dfs函数组成

  1. 得有搜索边界即结束条件,以及处理
  2. 对当前状态的检查,如果结果已经记录,则直接返回返回
  3. 从当前状态到下一个状态的转移,当前状态最优解的记录
  4. 对结果的返回
  5. 核心点:状态转移方程的确定。dp[state]=optimal(dp[state],dfs(next state)+cost);

代码模板

//type为类型,state为状态,在图论中一般都是横竖坐标
type dfs(state){
    if(结束条件){
        处理;
        return type; //返回对应类型的值
    }
    
    if(当前状态的解已被记录) return dp[state];
    //跟动态规划一样或者说跟dfs一样遍历下一个状态
    for each next state{
        if(检查当前状态是否符合约束条件){
            dp[state]=optimal(dp[state],dfs(next state)+cost);
        }
    }
    return dp[state];
}

例题代码实现

  • 蓝桥杯题:滑行

    image

    #include <iostream>
    using namespace std;
    
    int mp[105][105], n, m,dp[105][105];
    int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
    
    int dfs(int x,int y){
        if(dp[x][y]!=-1) return dp[x][y];
        dp[x][y]=1;
        for(int i=0;i<4;++i){
            int px=x+dx[i];
            int py=y+dy[i];
            if(px>=0&&py>=0&&px<n&&py<m&&mp[px][py]<mp[x][y]){
                dp[x][y]=max(dp[x][y],dfs(px,py)+1);
            }
        }
        return dp[x][y];
    }
    
    int main(){
        for(int i=0;i<n;++i){
            for(int j=0;j<m;++j){
                cin>>mp[i][j];
                dp[i][j]=-1;
            }
        }
        int cnt=1;
        for(int i=0;i<n;++i){
            for(int j=0;j<m;++j){
                cnt=max(cnt,dfs(i,j));
            }
        }
        cout<<cnt<<endl;
        return 0;
    }
    

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

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

相关文章

固态硬盘数据怎么恢复?用这4个软件你就知道了。

其实想要恢复固态硬盘里面的数据&#xff0c;方法有很多种。我们可以从回收站恢复&#xff0c;用备份恢复&#xff0c;或者是找专业人员帮助恢复。如果这些方法都不行的话&#xff0c;可以试试使用专业的数据恢复软件。我知道的数据恢复软件就有好几款&#xff0c;可以分享给大…

java编程行业特点

Java编程行业是一个庞大且充满活力的领域&#xff0c;它涵盖了从桌面应用到企业级应用、从Web开发到移动应用、从大数据处理到云计算服务的广泛范围。Java作为一种跨平台、面向对象的编程语言&#xff0c;自1995年发布以来&#xff0c;一直受到全球开发者的青睐&#xff0c;并在…

我的5周年创作纪念日,不忘初心,方得始终。

一、机缘 五年前&#xff0c;我怀着对知识的渴望和分享的热情&#xff0c;踏入了 CSDN 这个充满活力的技术交流平台&#xff0c;开启了我的创作之旅。那时的我&#xff0c;刚刚在技术的海洋中启航&#xff0c;渴望找到一个地方记录自己的成长足迹&#xff0c;与更多的人分享自…

【模板的特殊继承关系】用参数化的方式表达成员函数的虚拟性

一、使用混入技术实现的简单范例 成员函数的虚拟性可以通过特殊的继承来表达&#xff0c;我们先看看一个简单的范例&#xff0c;通过混入技术来实现&#xff1a; //基类 template<typename... T> class Base:public T... { public:void myfunc(){std::cout << &q…

禹神3小时快速上手typescript

一、TypeScript简介 TypeScript 由微软开发&#xff0c;是基于 JavaScript 的⼀个扩展语⾔。TypeScript 包含了 JavaScript 的所有内容&#xff0c;即&#xff1a; TypeScript 是 JavaScrip t 的超集。TypeScript 增加了&#xff1a;静态类型检查、接⼝、 泛型等很多现代开发特…

6--SpringBootWeb案例(详解)

目录 环境搭建 部门管理 查询部门 接口文档 代码 删除部门 接口文档 代码 新增部门 接口文档 代码 已有前端&#xff0c;根据接口文档完成后端功能的开发 成品如下&#xff1a; 环境搭建 1. 准备数据库表 (dept 、 emp) -- 部门管理 create table dept( id int un…

云计算第四阶段------CLOUD Day4---Day6

Cloud DAY4 项目架构图&#xff1a; 环境准备&#xff1a; 主机名称IP地址配置logstash192.168.1.27最低配置4核8G #书接上文&#xff0c;我们在华为云平台租了几台云服务器&#xff0c;这次买一台性能好的服务器&#xff0c;作为logstash软件部署的载体。 今天给小伙伴们带来…

【装机教程】Visual Studio Community 2019离线安装

Visual Studio 2019离线安装 由于现在 官网只支持在线安装最新版的Visual Studio 2022&#xff0c;因此 Visual Studio Community 2019需要离线安装。 下载离线安装镜像&#xff0c;并解压。点击vs_setup.exe运行。 选择安装位置&#xff0c;四处位置需要确定。 选择语言包&…

CSP-J 2019 入门级 第一轮(初赛) 完善程序(1)

【题目】 CSP-J 2019 入门级 第一轮&#xff08;初赛&#xff09; 完善程序&#xff08;1&#xff09; 1.&#xff08;矩阵变幻&#xff09;有一个奇幻的矩阵&#xff0c;在不停的变幻&#xff0c;其变幻方式为&#xff1a; 数字 0 变成矩阵 0 0 0 1 数字 1 变成矩阵 1 1 1 0 …

沉浸式利用自然语言无代码开发工具生成式AI产品应用(下)

背景 小伙伴们过去在开发应用时&#xff0c;经常需要编写大量代码文件以实现业务逻辑&#xff0c;想必肯定有小伙伴开发过类似于快消行业索赔处理、订单库存跟踪和项目审批等系统。去解决这些业务实际问题&#xff0c;我们需要定制地开发业务应用程序为这些问题提供解决方案。…

手写redis实现分布式锁详细教程,满足可续锁、可重入等分布式锁条件

前言 本文将讨论的做一个高并发场景下避不开的话题&#xff0c;即redis分布式锁。比如在淘宝 的秒杀场景、热点新闻和热搜排行榜等。可见分布式锁是一个程序员面向高级的一门必修课&#xff0c;下面请跟着本篇文章好好学习。 redis分布式锁有哪些面试题 1.Redis做分布式的时…

C语言 | Leetcode C语言题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; bool isLeafNode(struct TreeNode *node) {return !node->left && !node->right; }int sumOfLeftLeaves(struct TreeNode *root) {if (!root) {return 0;}struct TreeNode **q malloc(sizeof(struct TreeNode *) * 2001);in…

JVM 一个对象是否已经死亡?

目录 前言 引用计数法 可达性分析法 引用 finalize() 方法区回收 前言 虚拟机中垃圾回收器是掌握对象生死的判官, 只要是垃圾回收器认为需要被回收的, 那么这个对象基本可以宣告"死亡". 但是也不是所有的对象, 都需要被回收, 因此, 我们在学习垃圾回收的时候…

Linux系统应用之知识补充——OpenEuler(欧拉)的安装和基础配置

前言 这篇文章将会对OpenEuler的安装进行详解&#xff0c;一步一步跟着走下去就可以成功 注意 &#xff1a;以下的指令操作最好在root权限下进行&#xff08;即su - root&#xff09; ☀️工贵其久&#xff0c;业贵其专&#xff01; 1、OpenEuler的安装 这里我不过多介绍&a…

markdown 使用技巧

文章目录 markdown使用技巧1.标题快捷键设置2.文档可读性设置 markdown使用技巧 1.标题快捷键设置 ctl 1:一级标题 ctl 2:二级标题 ctl 3:三级标题 ctl 4:四级标题 ...2.文档可读性设置 输入~~~pro 可选择代码框&#xff0c;并且可以选择不同的字体 ctrl shift ] : 可…

Flink学习2

创建一个无界流 package com.qyt; import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.Keye…

《微信小程序实战(2) · 组件封装》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

138、Java内部类源码

01.代码如下&#xff1a; package TIANPAN;class Outer { // 外部类private String msg "Hello World !";class Inner { // 定义一个内部类private String info "世界&#xff0c;你好&#xff0…

【深度分析】OpenAI o1是最强的推理模型,却不是最强模型!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

磁盘写操作压力测试工具的设计与实现

磁盘写操作压力测试工具的设计与实现 1. 设计概述2. 关键技术点3. 伪代码设计4. C代码实现5. 运行与测试6. 结论在进行磁盘性能评估时,写操作压力测试是不可或缺的一部分。本篇文章将介绍如何使用C语言结合系统调用,设计并实现一个针对磁盘写操作的压力测试工具。这个工具将模…