【C++刷题】优选算法——递归第四辑

记忆化搜索篇

  • 什么是记忆化搜索?
    • 带 备忘录 的递归
  • 如何实现记忆化搜索?
    • a.添加一个备忘录 <可变参数,返回值>
    • b.每次递归返回的时候,把结果放到备忘录里
    • c.每次递归进入的时候,先查看一下备忘录
  • 记忆化搜索 vs 常规动态规划:
    • 相同点:
      • 都是暴力解法(暴搜)
      • 优化方式都是把已经计算出的结果存起来
    • 不同点:
      • 记忆化搜索是递归形式
      • 常规动态规划是递推(循环)形式

问题:

  • 所有的递归(暴搜、深搜),都能改成记忆化搜索吗?
    不是的。 只有在递归的过程中,出现了大量完全相同的问题时,才能用记忆化搜索的方式优化。
  • 以 暴搜->记忆化搜索->动态规划 的流程思路来解决动态规划问题,一定程度上是可行的。暴搜的阶段也可以为确定状态表示,提供一个参考方向。
  1. 斐波那契数
// 1 - 递归
int dfs(int n)
{if(n == 0 || n == 1) return n;return dfs(n-1) + dfs(n-2);
}
int fib(int n)
{return dfs(n);
}// 2 - 记忆化搜索
unordered_map<int, int> memo; // 创建备忘录
int dfs(int n)
{if(n == 0 || n == 1){if(!memo.count(n)) memo[n] = n; // 返回之间添加备忘录return n;}if(memo.count(n)) return memo[n]; // 进入之前查看备忘录else{memo[n] = dfs(n-1) + dfs(n-2);return memo[n];}}
int fib(int n)
{return dfs(n);
}// 3 - 动态规划
int fib(int n)
{// 0.预处理if(n == 0 || n == 1) return n;// 1.dp数组vector<int> dp(n + 1, 0);// 2.初始化dp[1] = 1;// 3.状态转移方程for(int i = 2; i < dp.size(); ++i){dp[i] = dp[i-1] + dp[i-2];}// 4.返回值return dp.back();
}
  1. 不同路径
// 1 - 记忆化搜索
vector<vector<int>> memo;
int dfs(int i, int j)
{if(i == 0 || j == 0){memo[i][j] = 1;return 1;}if(memo[i][j] == 0) memo[i][j] = dfs(i - 1, j) + dfs(i, j - 1);return memo[i][j];
}
int uniquePaths(int m, int n)
{memo = vector<vector<int>>(m, vector<int>(n, 0));return dfs(m-1, n-1);
}// 2 - 动态规划
int uniquePaths(int m, int n)
{// 1.dp数组vector<vector<int>> dp(m, vector<int>(n));// 2.初始化for (int i = 0; i < m; ++i){dp[i][0] = 1;}for (int i = 0; i < n; ++i){dp[0][i] = 1;}// 3.状态转移方程for (int row = 1; row < m; ++row){for (int col = 1; col < n; ++col){dp[row][col] = dp[row - 1][col] + dp[row][col - 1];}}// 4.返回值return dp.back().back();
}
  1. 最长递增子序列
vector<int> memo;
int dfs(vector<int>& nums, int step)
{if(memo[step] != 0) return memo[step];int ret = 1;for(int i = step + 1; i < nums.size(); ++i){if(nums[i] > nums[step]){ret = max(ret, dfs(nums, i) + 1);}}memo[step] = ret;return ret;
}
int lengthOfLIS(vector<int>& nums)
{memo = vector<int>(nums.size(), 0);int ret = 0;for(int i = 0; i < nums.size(); ++i){ret = max(ret, dfs(nums, i));}return ret;
}
  1. 猜数字大小 II
vector<vector<int>> memo;
int dfs(int start, int end)
{if(start >= end) return 0;if(memo[start][end] != -1) return memo[start][end];int ret = INT_MAX;for(int i = start; i <= end; ++i){ret = min(ret, i + max(dfs(start, i - 1), dfs(i + 1, end)));}memo[start][end] = ret;return ret;
}
int getMoneyAmount(int n)
{memo = vector<vector<int>>(n+1, vector<int>(n+1, -1));return dfs(1, n);
}
  1. 矩阵中的最长递增路径
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
vector<vector<int>> memo;
int dfs(vector<vector<int>>& matrix, int i, int j)
{if(memo[i][j] != -1) return memo[i][j];int ret = 0;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < matrix.size())&& (y >= 0 && y < matrix[0].size())&& (matrix[x][y] > matrix[i][j])){ret = max(ret, 1 + dfs(matrix, x, y));}}memo[i][j] = ret;return ret;
}
int longestIncreasingPath(vector<vector<int>>& matrix)
{int m = matrix.size();int n = matrix[0].size();memo = vector<vector<int>>(m, vector<int>(n, -1));int ret = 0;for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){ret = max(ret, 1 + dfs(matrix, i, j));}}return ret;
}

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

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

相关文章

对于个人而言,大数据时代如何更好地管理自己的信息?

在大数据时代&#xff0c;管理个人信息变得尤为重要。以下是几个建议来更好地管理个人信息&#xff1a; 认识和了解自己的数字足迹&#xff1a;了解自己在互联网上的活动&#xff0c;包括浏览历史、社交媒体和在线购物数据等。通过查阅自己的帐户设置和隐私选项&#xff0c;可以…

golang信号通知 signal.Notify NotifyContext完整示例

在看示例之前有必要先看看Go程序中信号的默认行为&#xff0c; go中信号的默认行为如下&#xff1a; SIGHUP、SIGINT或SIGTERM信号会导致程序退出。SIGQUIT、SIGILL、SIGTRAP、SIGABRT、SIGSTKFLT、SIGEMT或SIGSYS信号会导致程序退出并进行堆栈转储。SIGTSTP、SIGTTIN或SIGT…

使用Nginx作为反向代理实现MQTT内外网通信

使用Nginx作为反向代理实现MQTT内外网通信 步骤1: 安装Nginx 确保你的服务器上已安装Nginx。如果未安装&#xff0c;可以通过以下命令在Ubuntu上安装Nginx&#xff1a; sudo apt update sudo apt install nginx步骤2: 配置Nginx 编辑Nginx的配置文件&#xff0c;通常是/etc…

全面掌握Prompt提示词技巧

本文综合介绍了Prompt提示词的各种技巧&#xff0c;包括高级提示工程技术、设计提示的通用技巧、优化prompt的十个技巧、AI提示词网站合集、提示工程指南以及ChatGPT提示词技巧等&#xff0c;旨在帮助读者深入理解和应用这些技巧&#xff0c;提高与AI模型的交互效率和质量。 文…

C++ 类模板 函数模板

类模板 #include <bits/stdc.h> using namespace std; //多少变量就写多少个 template<typename T1, typename T2> class Cat { public:Cat(){}Cat(T1 name, T2 age){this->age age;this->name name;}void print(){cout << this->name << …

Python脚本启动应用并输入账号或密码

一、简介 如果每天要启动某个软件还要输入账号密码登录的需求的话&#xff0c;可以参考本文章&#xff1b; 二、Python环境 环境&#xff1a;Python3.11 已经在Windows电脑中配置Python环境变量&#xff0c;且配置了pipd的环境变量&#xff1b; 三、安装模块 安装所需要的…

计算机毕业设计 | SpringBoot招投标系统 任务发布网站(附源码)

1&#xff0c;绪论 在市场范围内&#xff0c;任务发布网站很受欢迎&#xff0c;有很多开发者以及其他领域的牛人&#xff0c;更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上&#xff0c;任务发布网站鱼龙混杂&#xff0c;用户需要找一个…

(原创)从右到左排列RecycleView的数据

问题的提出 当我们写一个Recycleview时&#xff0c;默认的效果大概是这样的&#xff1a; 当然&#xff0c;我们也可以用表格布局管理器GridLayoutManager做成这样&#xff1a; 可以看到&#xff0c;默认的绘制方向是&#xff1a; 从左到右&#xff0c;从上到下 那么问题来了…

STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

一、模块资料 &#xff08;1&#xff09;模块简介 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本&#xff0c;增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件…

执行普罗米修斯插件mysqld_exporter出现闪退问题如何解决?

运行 mysqld_exporter.exe 文件闪退的问题可能是由于配置文件或环境变量设置不正确导致的。 检查配置文件 my.cnf&#xff1a; 打开 my.cnf 文件&#xff0c;确保其中的配置项正确无误&#xff0c;尤其是 MySQL 数据库的连接信息。配置示例&#xff1a;[client] useryour_mysql…

如何评价 OpenAI 最新发布支持实时语音对话的模型GPT-4o?OpenAI发完GTP-4o,国内大模型行业还有哪些机会?

文章目录 OpenAI发完GTP-4o&#xff0c;国内大模型行业还有哪些机会&#xff1f;详细了解一下OpenAI最新发布的支持实时语音对话的模型GPT-4o国内大模型如何寻找发展机会&#xff1f;想要发展技术必须要创新与追赶或许应用场景拓展也是一种出路产业生态构建 ChatGPT 问世才 17 …

阿里妈妈->创意图片生成

数智商业技术2.0时代的新「三驾马车」,阿里妈妈郑波谈如何把握生成式大模型ACM\x26#39;23 中国图灵大会 SIGAI China 论坛上,阿里妈妈及闲鱼 CTO 郑波分享关于数智商业技术的洞见。他认为在这轮生成式 AI 大模型的驱动下,数智商业技术将进入 2.0 时代,其中知识驱动、逻辑推…

创建数据库数据插入、更新与删除

创建数据库和创建表 一、实验目的 &#xff08;1&#xff09;熟悉和掌握数据库的创建和连接方法&#xff1b; &#xff08;2&#xff09;熟悉和掌握数据库表的建立、修改和删除&#xff1b; &#xff08;3&#xff09;加深对表的实体完整性、参照完整性和用户自定义完整性的…

【程序员如何送外卖】

嘿&#xff0c;咱程序员要在美团送外卖&#xff0c;那还真有一番说道呢。 先说说优势哈&#xff0c;咱程序员那逻辑思维可不是盖的&#xff0c;规划送餐路线什么的&#xff0c;简直小菜一碟。就像敲代码找最优解一样&#xff0c;能迅速算出怎么送最省时间最有效率。而且咱平时…

Solana 验证节点搭建教程 SOL节点

搭建验证节点 (成功下载快照) 部署 Solana 验证节点 由于项目需求&#xff0c;需要部署一台solana节点&#xff0c;我们从一开始搭建&#xff0c;遇到许多坑&#xff0c;做个记录。 一定要注意服务器配置&#xff0c;配置不够&#xff0c;rpc启动不起来。 一、简介 官网地址…

AIGC 007-E4T基于编码器的域调优用于文本到图像模型的快速个性化!

AIGC 007-E4T基于编码器的域调优用于文本到图像模型的快速个性化&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文提出了一种使用领域特定编码器来快速将文本到图像模型适配到新领域的方案。这种被称为基于编码器的领域微调 (E4T) 的方法&#xff0c;专…

【Linux】使用pip3安装pexpect,解决报错:the ssl module in Python is not available

pip3是python3的包管理工具&#xff0c;安装、卸载、更新等管理python包。 pexpect是其中一个python库&#xff0c;用于自动化与终端交互。 centos7使用pip3安装pexpect&#xff0c;报错&#xff1a; pip3 install pexpect 原因&#xff1a;使用python3解释器导入ssl库检查ss…

常见的JavaScript设计模式(一)

常见的JavaScript设计模式 一、模块模式(Module Pattern)二、单例模式&#xff08;SingIeton Pattern&#xff09;三、工厂模式&#xff08;Factory Pattern&#xff09;四、观察者模式&#xff08;Observer Pattern&#xff09; 常见的JavaScript设计模式包括 模块模式、 在…

Sylar C++高性能服务器学习记录18 【Address模块-代码分析篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频。 由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去。 每每想起倍感惋惜&#xff0c;遂提笔再续前缘。 为了能更好的看懂sylar&…

分布式事务解决方案(最终一致性【TCC解决方案】)

最终一致性分布式事务概述 强一致性分布式事务解决方案要求参与事务的各个节点的数据时刻保持一致&#xff0c;查询任意节点的数据都能得到最新的数据结果&#xff0c;这就导致在分布式场景&#xff0c;尤其是高并发场景下&#xff0c;系统的性能受到了影响。而最终一致性分布式…