[Algorithm][回溯][记忆化搜索][最长递增子序列][猜数字大小Ⅱ][矩阵中的最长递增路径]详细讲解

目录

  • 1.最长递增子序列
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.猜数字大小 II
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.矩阵中的最长递增路径
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.最长递增子序列

1.题目链接

  • 最长递增子序列

2.算法原理详解

  • 题目解析:从每个位置,依次计算其最长递增子序列
    请添加图片描述

  • 思路选择

    • 暴搜(递归) -> 本题会超时:P
    • 记忆化搜索
    • 动态规划
  • 尝试:暴搜 -> 记忆化搜索 -> 动态规划

  • 暴搜

    • DFS()设计int DFS(nums, pos) -> 每次从pos位置找最长递增子序列
    • 函数体:依次从pos位置往后枚举,更新本次最长递增子序列
  • 本题有大量重复要计算的值,故可以用记忆化搜索

  • 记忆化搜索

    • 备忘录vector<int> mem
    • 返回之前,把结果存在备忘录中
    • 递归之前,查找一下备忘录是否有要找的值
  • 动态规划

    • 注意:本题是前面的值依赖后面的值,所以**填表顺序要从后往前填**

3.代码实现

// v1.0 暴搜
class Solution 
{
public:int lengthOfLIS(vector<int>& nums) {int ret = 0;for(int i = 0; i < nums.size(); i++){ret = max(ret, DFS(nums, i));}return ret;}int DFS(vector<int>& nums, int pos){int ret = 1; // 细节:初值为1for(int i = pos + 1; i < nums.size(); i++){if(nums[i] > nums[pos]){ret = max(ret, DFS(nums, i) + 1);    }}return ret;}
};
-------------------------------------------------------------------------------
// v2.0 记忆化搜索
class Solution 
{vector<int> mem;
public:int lengthOfLIS(vector<int>& nums) {mem.resize(nums.size());int ret = 0;for(int i = 0; i < nums.size(); i++){ret = max(ret, DFS(nums, i));}return ret;}int DFS(vector<int>& nums, int pos){if(mem[pos] != 0){return mem[pos];}int ret = 1; // 细节:初值为1for(int i = pos + 1; i < nums.size(); i++){if(nums[i] > nums[pos]){ret = max(ret, DFS(nums, i) + 1);    }}mem[pos] = ret;return ret;}
};
-------------------------------------------------------------------------------
// v3.0 动态规划
int lengthOfLIS(vector<int>& nums) 
{int n = nums.size();vector<int> dp(n, 1);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;
}

2.猜数字大小 II

1.题目链接

  • 猜数字大小 II

2.算法原理详解

  • 题目思路解析

    • 每次给出一个数据范围,从中找出花费最少的一次
    • 但是当一个结点的左右子树返回时,要取最大的,因为要确保"能获胜的最小金额",就要让左右子树的两种情况都能实现
    • 最优解:取最小是在该范围内,每个数对应的最终结果取最小
      请添加图片描述
  • 思路选择

    • 暴搜(递归) -> 本题会超时:P
    • 记忆化搜索
  • 暴搜

    • DFS()设计int DFS(int left, int right) -> 每次从[left, right]区间内找出最小的
    • 函数体:依次遍历[left, right]中的各个数,递归分析左右⼦树,求出所有情况下的最⼩值
    • 递归出口
      • left > right:区间不存在,返回0
      • left == right:就是最后的一个结果,此时无需花钱,返回0
  • 本题有大量重复要计算的值,故可以用记忆化搜索
    请添加图片描述

  • 记忆化搜索

    • 备忘录vector<int> mem
    • 返回之前,把结果存在备忘录中
    • 递归之前,查找一下备忘录是否有要找的值

3.代码实现

// v1.0 暴搜
class Solution 
{
public:int getMoneyAmount(int n) {return DFS(1, n);}int DFS(int left, int right){if(left >= right){return 0;}int ret = INT_MAX;for(int i = left; i <= right; i++) // 选择头结点{int x = DFS(left, i - 1);int y = DFS(i + 1, right);ret = min(ret, max(x, y) + i);}return ret;}
};
------------------------------------------------------------------------
// v2.0 记忆化搜索
class Solution 
{vector<vector<int>> mem;
public:int getMoneyAmount(int n) {mem.resize(n + 1, vector(n + 1, 0));return DFS(1, n);}int DFS(int left, int right){if(left >= right){return 0;}if(mem[left][right] != 0){return mem[left][right];}int ret = INT_MAX;for(int i = left; i <= right; i++) // 选择头结点{int x = DFS(left, i - 1);int y = DFS(i + 1, right);ret = min(ret, max(x, y) + i);}mem[left][right] = ret;return ret;}
};

3.矩阵中的最长递增路径

1.题目链接

  • 矩阵中的最长递增路径

2.算法原理详解

  • 题目解析:遍历数组,对每个位置来一次DFS即可
  • 思路选择
    • 暴搜(递归) -> 本题会超时:P
    • 记忆化搜索
  • 本题有大量重复要计算的值,故可以用记忆化搜索
    请添加图片描述

3.代码实现

// v1.0 暴搜
class Solution 
{int n, m;// "方向"向量数组int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:int longestIncreasingPath(vector<vector<int>>& matrix) {n = matrix.size(), m = matrix[0].size();int ret = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){ret = max(ret, DFS(matrix, i, j));}}return ret;}int DFS(vector<vector<int>>& matrix, int i, int j){int ret = 1;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < n && y >= 0 && y < m && matrix[x][y] > matrix[i][j]){ret = max(ret, DFS(matrix, x, y) + 1);}}return ret;}
};
---------------------------------------------------------------------------
// v2.0 记忆化搜索
class Solution 
{int n, m;vector<vector<int>> mem;// "方向"向量数组int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:int longestIncreasingPath(vector<vector<int>>& matrix) {n = matrix.size(), m = matrix[0].size();mem.resize(n, vector<int>(m, 0));int ret = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){ret = max(ret, DFS(matrix, i, j));}}return ret;}int DFS(vector<vector<int>>& matrix, int i, int j){if(mem[i][j] != 0){return mem[i][j];}int ret = 1;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < n && y >= 0 && y < m && matrix[x][y] > matrix[i][j]){ret = max(ret, DFS(matrix, x, y) + 1);}}return mem[i][j] = ret;}
};

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

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

相关文章

内部类知识点

什么是内部类&#xff1f; 内部类何时出现&#xff1f;B类是A类的一部分&#xff0c;且B单独存在无意义 内部类分类 成员内部类&#xff1a; 当内部类被private修饰后&#xff0c;不能用方法2 调用外部类成员变量 内部类里面有隐藏的outer this来记录 静态内部类 创建对象&…

水电集中抄表是什么?

1.定义分析&#xff1a;水电集中抄表 水电集中抄表是一种现代化能源管理体系方法&#xff0c;它利用先进的信息科技&#xff0c;如物联网技术、云计算等&#xff0c;完成对水电表数据的远程智能采集与处理。这种方法改变了传统的人工上门服务抄表方式&#xff0c;提高了效率&a…

Biome-BGC生态系统模型与Python融合技术实践应用

Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数&#xff0c;模拟日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天…

ECharts实现地图飞线

echarts版本&#xff1a;https://echarts.apache.org/zh/changelog.html v5.x.x版本&#xff1a;不提供china.js和china.json文件 v4.x.x版本&#xff1a;使用npm安装echarts&#xff0c;默认包含china.js和china.json文件 目录 一、Html工程 二、vue工程 三、vue工程 四、矢…

c/c++ 编译过程

C的编译过程通常可以分为四个阶段&#xff1a;预处理、编译、汇编和链接。下面是这四个阶段的详细说明&#xff1a; 预处理&#xff08;Preprocessing&#xff09;&#xff1a;在这个阶段&#xff0c;预处理器&#xff08;cpp&#xff09;会处理源代码文件中的预处理指令&#…

【科普知识】伺服电机中的内置制动器

在工业自动化和机器人技术快速发展的今天&#xff0c;伺服电机作为核心驱动元件&#xff0c;其性能与功能直接影响整个系统的运行效率与稳定性。 近年来&#xff0c;一体化伺服电机技术不断融合创新&#xff0c;并逐步加入了许多新的硬件和软件的功能&#xff0c;为工业自动化领…

【施磊】C++语言基础提高:深入学习C++语言先要练好的内功

课程总目录 文章目录 一、进程的虚拟地址空间内存划分和布局二、函数的调用堆栈详细过程三、程序编译链接原理1. 编译过程2. 链接过程 一、进程的虚拟地址空间内存划分和布局 任何的编程语言 → \to → 产生两种东西&#xff1a;指令和数据 编译链接完成之后会产生一个可执行…

Linux备份服务及rsync企业备份架构(应用场景)

备份服务概述 备份服务:需要使用到脚本,打包备份,定时任务. 备份服务:rsyncd服务,不同主机之间数据传输. 特点&#xff1a; rsync是个服务也是命令使用方便&#xff0c;具有多种模式传输数据的时候是增量传输 增量与全量&#xff1a; 全量 &#xff1a;无论多少数据全部推…

设备管理全解析:从选购到报废的全方位指南

在现代企业快速发展、智能化运营过程中&#xff0c;企业设备管理是保障生产连续性和效率的核心环节&#xff0c;其重要性不言而喻。然而&#xff0c;许多企业在设备管理内容流程方面仍然使用传统管理办法&#xff0c;这不仅影响了生产效率&#xff0c;也增加了不必要的成本。那…

vuejs路由和组件系统

前端路由原理 createRouter * hash* window.addEventListener(hashChange)* 两种实现路由切换的模式&#xff1a;UI组件&#xff08;router-link&#xff0c;router-view&#xff09;&#xff0c;Api&#xff08;push()方法&#xff09; * history * HTML5新增的API &#xff0…

每日一题(1)

在看一本08年出版的书的时候&#xff0c;看到了这样一个问题&#xff0c;感觉答案很奇怪&#xff1a; public class demo_p22 {public static void main(String args[]){int sCook1,sFish2;//各技能标记character ch1new character();if(ch1.haveSkill(sCook))System.out.print…

【CSP CCF记录】202012-2 期末预测之最佳阈值

题目 过程 思路 第一次没用前缀和&#xff0c;暴力求解得50分。 采用前缀和方法。 1. 对原数组stu[i]进行排序。 2. 计算前缀和数组s[]&#xff0c;s[i]表示安全指数的y_i的前缀和&#xff0c;即安全指数小于等于y_i时的实际挂科情况&#xff0c;y_i之前有多少个未挂科&am…

无线领夹麦克风哪个品牌好?无线麦克风品牌排行榜前十名推荐

​在当今的数字化浪潮中&#xff0c;个人声音的传播和记录变得尤为重要。无论是会议中心、教室讲台还是户外探险&#xff0c;无线领夹麦克风以其卓越的便携性和连接稳定性&#xff0c;成为了人们沟通和表达的首选工具。面对市场上琳琅满目的无线麦克风选择&#xff0c;为了帮助…

Python筑基之旅-MySQL数据库(三)

目录 一、数据库操作 1、创建 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 二、数据表操作 1、创建 1-1、用mysql-…

记录Python低代码开发框架zdppy_amcrud的开发过程

实现新增接口 基础代码 import env import mcrud import api import snowflakeenv.load(".env") db mcrud.new_env()table "user" columns ["name", "age"]async def add_user(req):data await api.req.get_json(req)values [d…

SkyEye对接CANoe:助力汽车软件功能验证

01.简介 CANoe&#xff08;CAN open environment&#xff09;是德国Vector公司专为汽车总线设计而开发的一款通用开发环境&#xff0c;作为车载网络和ECU开发、测试和分析的专业工具&#xff0c;支持从需求分析到系统实现的整个系统的开发过程。CANoe丰富的功能和配置选项被OE…

虚拟ECU:彻底改变汽车软件开发与测试

汽车开发领域有着垂直性较强的一系列需求&#xff0c;其中最为瞩目的需求之一就是对安全高效的软件测试方法的需求。传统的汽车开发偏向使用硬件原型与真实ECU进行软件测试&#xff0c;但由于硬件设备往往在开发周期的中后阶段才生产完成&#xff0c;给汽车开发带来了成本与时间…

电商内卷时代,视频号小店凭借一己之力“脱颖而出”

大家好&#xff0c;我是电商笨笨熊 今年618各大电商平台花样百出&#xff1b; 某宝更是直接取消了“预售”&#xff0c;从5月就开始进入618预热期&#xff1b; 不少玩家既开心又难过&#xff0c;市场如此内卷&#xff0c;618确实是个爆发期&#xff0c;但更多的需要不断压低…

Star CCM+分配零部件至区域后交界面丢失-更新找回

前言 在工程应用中&#xff0c;将零部件分配至区域后&#xff0c;一般常规的操作需要对交界面进行检查。偶尔会发现交界面丢失。遇到此类问题&#xff0c;在没有做其他操作前&#xff08;比如画网格&#xff09;&#xff0c;可以选择先删除所有区域在重新分配至区域。若已经进…