【leetcode】记忆化搜索

记忆化搜索

  • 一、斐波那契数
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 二、不同路径
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 三、最长递增子序列
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 四、猜数字大小II
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 五、矩阵中的最长递增路径
    • 1、题目描述
    • 2、代码
    • 3、解析


一、斐波那契数

1、题目描述

leetcode链接
在这里插入图片描述

2、代码

常规递归暴搜代码:

class Solution
{
public:int fib(int n){if(n == 0) return 0;if(n == 1) return 1;return fib(n - 1) + fib(n - 2);}
};

备忘录版:

class Solution 
{
public:// 备忘录int memo[31];int fib(int n) {memset(memo, -1, sizeof(memo)); // 先将备忘录进行初始化为-1,因为-1根本就不会遇到return dfs(n);}int dfs(int n){// 先判断一下在不在备忘录中if(memo[n] != -1) // 在备忘录中就用备忘录中的{return memo[n];}if(n == 0 || n == 1){memo[n] = n;return n;}memo[n] = dfs(n - 1) + dfs(n - 2); // 返回之前先保存一下return memo[n];}
};

动态规划版本:

class Solution 
{
public:// dp表int dp[31];int fib(int n) {dp[0] = 0;dp[1] = 1;for(int i = 2; i <= n; i++){dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];    }
};

3、解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、不同路径

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

记忆化搜索:

class Solution 
{
public:vector<vector<int>> memo;int uniquePaths(int m, int n) {memo = vector<vector<int>>(m + 1, vector<int>(n + 1));return dfs(m, n);}int dfs(int i, int j){if(memo[i][j] != 0){return memo[i][j];}if(i == 0 || j == 0){return 0; // 越界情况}if(i == 1 && j == 1){memo[i][j] = 1;return 1;}memo[i][j] = dfs(i - 1, j) + dfs(i, j - 1);return memo[i][j];}
};

动态规划:

class Solution 
{
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m + 1, vector<int>(n + 1));dp[1][1] = 1;for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){if(i == 1 && j == 1){continue;}dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m][n];}
};

3、解析

在这里插入图片描述

三、最长递增子序列

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

记忆化搜索:

class Solution 
{
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> memo(n); // 定义一个备忘录int ret = 0;for(int i = 0; i < n; i++){ret = max(ret, dfs(i, nums, memo)); // 相信dfs一定能处理好往后进行遍历}return ret;}int dfs(int pos, vector<int>& nums, vector<int>& memo){if(memo[pos] != 0) // 此处是已经使用过了{return memo[pos];}int ret = 1; // 必须从1开始,不然一直是0比较,会出现边界情况for(int i = pos + 1; i < nums.size(); i++){if(nums[i] > nums[pos])ret = max(ret, dfs(i, nums, memo) + 1);}memo[pos] = ret; // 保存一下return memo[pos];}
};

动态规划做法:

class Solution 
{
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 1); // 定义一个有n个数为1的dp数组int ret = 0;// 从后往前遍历for(int i = n - 1; i >= 0; i--){for(int j = i + 1; j < n; j++){if(nums[j] > nums[i]){dp[i] = max(dp[i], dp[j] + 1);}}ret = max(ret, dp[i]); // 每次更新一下}return ret;}
};

3、解析

在这里插入图片描述

四、猜数字大小II

1、题目描述

leetcode链接
在这里插入图片描述

2、代码

class Solution 
{
public:// 定义一个备忘录vector<vector<int>> memo;int getMoneyAmount(int n) {memo = vector<vector<int>>(n + 1, vector<int>(n + 1));// 暴搜return dfs(1, n); // 传一个区间}int dfs(int left, int right){if(left >= right) return 0;if(memo[left][right] != 0){return memo[left][right];}int ret = INT_MAX;for(int head = left; head <= right; head++){int x = dfs(left, head - 1); // 左边递归一下int y = dfs(head + 1, right); // 右边递归一下ret = min(ret, head + max(x, y)/*右边或者左边传上来的最大值*/);}memo[left][right] = ret;return ret;}
};

3、解析

在这里插入图片描述

五、矩阵中的最长递增路径

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

class Solution 
{
public:int m, n;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};vector<vector<int>> memo;int longestIncreasingPath(vector<vector<int>>& matrix) {int ret = 0;m = matrix.size();n = matrix[0].size();memo = vector<vector<int>>(m, vector<int>(n));for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){ret = max(ret, dfs(matrix, i, j));}}return ret;}int dfs(vector<vector<int>>& matrix, int i, int j){if(memo[i][j] != 0){return memo[i][j];}int ret = 1;for(int k = 0; k < 4; k++){int x = i + dx[k];int y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] > matrix[i][j]){ret = max(ret, dfs(matrix, x, y) + 1);}}memo[i][j] = ret;return ret;}
};

3、解析

在这里插入图片描述

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

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

相关文章

【java】小学生数学练习题目生成系统

本文章主要是CSDN-问答板块&#xff0c;有题主提出的问题&#xff0c;我这边将完整代码提供出来&#xff0c;仅供大家参考学习&#xff01; 一、效果截图 二、直接上代码 package com.example.dingtalk.question;import javax.script.ScriptEngine; import javax.script.Scrip…

PHP实践:Laravel中事件使用讲解

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

kafka生产者

1.原理 2.普通异步发送 引入pom&#xff1a; <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency><dependency><g…

2024022202-查询优化

查询优化 概述 关系系统和关系模型是两个密切相关而有不同的概念。支持关系模型的数据库管理系统称为关系系统。但是关系模型中并非每一部分都是同等重要的&#xff0c;所以我们不苛求完全支持关系模型的系统才能称为关系系统。因此&#xff0c;我们给出一个关系系统的最小要求…

【学习总结】慢SQL治理经验总结

一、慢SQL定义 执行超过1s的SQL为慢SQL 三、慢SQl的风险 系统的响应时间延迟&#xff0c;影响用户体验 资源占用增加&#xff0c;增高了系统的负载&#xff0c;其他请求响应时间也可能会收到影响。 慢SQL占用数据库连接的时间长,如果有大量慢SQL查询同时执行&#xff0c;可能…

C语言中的assert.h:调试助手与断言详解

在C语言编程中&#xff0c;assert.h头文件提供了非常有用的断言&#xff08;Assertion&#xff09;功能&#xff0c;它主要用于开发和调试阶段&#xff0c;确保程序在运行时满足某些预期条件。如果这些条件未得到满足&#xff0c;则程序会立即停止执行&#xff0c;并打印出有关…

冷链物流追踪:Java与MySQL的协同实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

第三百六十一回

文章目录 1. 概念介绍2. 实现方法2.1 环绕效果2.2 立体效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义SlideImageSwitch组件"相关的内容&#xff0c;本章回中将介绍两种阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

谷歌seo推广怎么做?

除了常规的优化之外&#xff0c;还可以针对特定垂直搜索进行优化&#xff0c;比如图片的以及视频的搜索优化&#xff0c;这对于贩卖自己产品的网站来说也是挺重要的一点 图片需要确保您的图片文件名包含相关关键词&#xff0c;并为每张图片添加描述性的ALT文本&#xff0c;以帮…

调用 Python 函数遗漏括号 ( )

调用 Python 函数遗漏括号 1. Example - error2. Example - correctionReferences 1. Example - error name "Forever Strong" print(name.upper()) print(name.lower)FOREVER STRONG <built-in method lower of str object at 0x0000000002310670>---------…

SqlServer2016离线安装--Microsoft R Open 和 Microsoft R Server安装文件位置

问题 SQL SERVE 2016离线安装&#xff0c;会出现“Microsoft R Open 和 Microsoft R Server 脱机安装”的界面&#xff0c; 无法点击下一步的情况&#xff0c;如下图&#xff1a; 原因 离线安装时需要下载两个文件 解决方案 1、访问路径下载文件 https://go.microsoft.c…

Python 实现 OBV 指标计算:股票技术分析的利器系列(7)

Python 实现 OBV 指标计算&#xff1a;股票技术分析的利器系列&#xff08;7&#xff09; 介绍算法解释 代码rolling函数介绍核心代码计算 VA 列计算 OBV 列计算 MAOBV 完整代码 介绍 OBV 指标是“On-Balance Volume”的缩写&#xff0c;意为“量价平衡指标”。它是一种用于衡…

《游戏引擎架构》 -- 学习4

资源及文件系统 文件系统 游戏引擎的文件系统API通常提供以下功能&#xff1a; 搜需路径&#xff1a;是含一串路径的字符串&#xff0c;各路径之间以特殊字符&#xff08;如冒号或分号&#xff09;分隔&#xff0c;找文件时就会从这些路径进行搜寻。例如在命令行下执行程序&a…

Code Composer Studio (CCS) - 全局搜索功能

Code Composer Studio [CCS] - 全局搜索功能 1. Ctrl H&#xff0c;全局搜索功能References 1. Ctrl H&#xff0c;全局搜索功能 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【AI大模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

2024牛客(4)K题

登录—专业IT笔试面试备考平台_牛客网 using i64 long long; using ll long long; constexpr ll M 1e9 7; template<class Info> struct SegmentTree {int n;std::vector<Info> info;SegmentTree() : n(0) {}SegmentTree(int n_, Info v_ Info()) {init(n_, …

Vue样式绑定

1. 绑定 HTML class ①通过class名称的bool值判断样式是否被启用 <template><!--通过样式名称是否显示控制样式--><div :class"{ haveBorder: p.isBorder, haveBackground-color: p.isBackgroundcolor }">此处是样式展示区域</div><br /…

Linux篇:开发工具yum/vim/gcc/g++/Makefile/gdb

一. yum&#xff1a;软件包管理器 什么是软件包&#xff1f; 在Linux 下安装软件 , 一个通常的办法是下载到程序的源代码 , 并进行编译 , 得到可执行程序 . 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好 , 做成软件包 (可以理解成windows 上的安装程序) 放在…

内网穿透的应用-如何本地部署Elasticsearch搜索分析引擎实现并发布公网远程访问

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎&#xff0c;它提供了一个分布式、多…

探索Flask框架:打造优雅而强大的Web应用

在当今互联网时代&#xff0c;Web应用的需求日益增长&#xff0c;而作为开发者&#xff0c;我们需要一个简洁明快、灵活可扩展的框架来满足这些需求。Flask框架作为一个Python微型框架&#xff0c;在其简洁的设计理念和丰富的扩展生态系统之间找到了完美的平衡&#xff0c;为我…