Day46 | 动态规划 :线性DP 最长递增子序列最长连续递增子序列

Day46 | 动态规划 :线性DP 最长递增子序列&&最长连续递增子序列

动态规划应该如何学习?-CSDN博客

本次题解参考自灵神的做法,大家也多多支持灵神的题解

最长递增子序列【基础算法精讲 20】_哔哩哔哩_bilibili

动态规划学习:

1.思考回溯法(深度优先遍历)怎么写

注意要画树形结构图

2.转成记忆化搜索

看哪些地方是重复计算的,怎么用记忆化搜索给顶替掉这些重复计算

3.把记忆化搜索翻译成动态规划

基本就是1:1转换

文章目录

  • Day46 | 动态规划 :线性DP 最长递增子序列&&最长连续递增子序列
    • 300.最长递增子序列
      • 思路分析(子问题):
      • 1.回溯 DFS
      • 2.记忆化搜索
      • 3.1:1翻译为动态规划
    • 674.最长连续递增序列
      • 思路:
      • 1.回溯法
      • 2.记忆化搜索
      • 3.动态规划

300.最长递增子序列

300. 最长递增子序列 - 力扣(LeetCode)

思路分析(子问题):

dfs(i)表示以nums[i]结尾的最长递增子序列的长度

我们往前找,只有找到比nums[i]小的nums[j]才往下递归,否则不进行递归

我们一次dfs(i)可以找出以nums[i]结尾的最长递增子序列的长度

dfs(i)=max(dfs(j))+1 {0<j<i}

加1加的是nums[i]本身

举个例子:

我们的i如果是5的话,nums[i]=7,枚举比它小的,即i=4,3,2 nums[i]=3,5,2

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
dfs(5)=max(dfs(4),dfs(3),dfs(2))+1

这样即可以把最长的情况枚举出来,还可以避免遗漏,因为每一次dfs我们都只找以nums[i]结尾的最长的递增子序列

如果以7结尾的话,那就是2,3,7

如果我们要再找以18结尾的

那就是

dfs(7)=max(dfs(5),dfs(4),dfs(3),dfs(2),dfs(1),dfs(0))+1

如果大家没有听太懂的话建议看看灵神的视频(知道那个意思,但是我也不知道该怎么讲)

1.回溯 DFS

1.返回值和参数

i是数组下标,我们最长递增子序列的最后一个数就是nums[i]

dfs(i)表示以nums[i]结尾的最长递增子序列的长度

int dfs(int i,vector<int>& nums)

2.终止条件

终止条件就是i<0,即子序列里面没有数字了

i<0我们的程序本身也不会执行,所以不需要终止条件

3.本层逻辑

我们以nums[i]结尾的最长递增子序列的长度不需要看i以后的数,所以每次从0-i进行枚举,如果比nums[i]才会继续往下选

我们一次dfs(i)算出来的是以nums[i]为结尾的最长子序列的长度

每一层递归函数向上返回的时候,由于我们是以nums[i]为结尾的最长递增子序列,所以长度最小为1,就是nums[i]本身,所以返回的时候要+1,加的就是自身

然后在主函数中遍历一遍nums数组,把所有的i都传一遍,挑出里面的最大值

	int dfs(int i,vector<int>& nums){int res=0;for(int j=0;j<i;j++)if(nums[j]<nums[i])res=max(res,dfs(j,nums));return res+1;}int lengthOfLIS(vector<int>& nums) {int res=0;for(int i=0;i<nums.size();i++)res=max(res,dfs(i,nums));return res;}

完整代码:

当然,这是超时的

class Solution {
public:int dfs(int i,vector<int>& nums){int res=0;for(int j=0;j<i;j++)if(nums[j]<nums[i])res=max(res,dfs(j,nums));return res+1;}int lengthOfLIS(vector<int>& nums) {int res=0;for(int i=0;i<nums.size();i++)res=max(res,dfs(i,nums));return res;}
};

2.记忆化搜索

就是搞一个哈希表dp,全都初始化为-1,每次返回前给哈希表dp赋值,碰到不是-1的那就是算过的,那就直接返回计算过的结果,不需要再次递归了

class Solution {
public:int dfs(int i,vector<int>& nums,vector<int>& dp){if(dp[i]!=0)return dp[i];int res=0;for(int j=0;j<i;j++)if(nums[j]<nums[i])res=max(res,dfs(j,nums,dp));return dp[i]=res+1;}int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),0);int res=0;for(int i=0;i<nums.size();i++)res=max(res,dfs(i,nums,dp));return res;}
};

3.1:1翻译为动态规划

1.确定dp数组以及下标的含义

dp[i]就是以nums[i]结尾的最长递增子序列的长度

2.确定递推公式

和dfs中也是对应的

dp[i]=max(dp[i],dp[j]+1);

3.dp数组如何初始化

都初始化为1是因为nums[i]自身就算一个长度

vector<int> dp(nums.size(),1);

4.确定遍历顺序

后续结果需要依赖前面的计算结果,故使用从前往后遍历

然后在计算的时候记录一下最大值,最后返回最大值就好

		for(int i=0;i<nums.size();i++){for(int j=0;j<i;j++)if(nums[j]<nums[i])dp[i]=max(dp[i],dp[j]+1);if(dp[i]>res)res=dp[i];}

完整代码

class Solution {
public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),1);int res=0;for(int i=0;i<nums.size();i++){for(int j=0;j<i;j++)if(nums[j]<nums[i])dp[i]=max(dp[i],dp[j]+1);if(dp[i]>res)res=dp[i];}return res;}
};

674.最长连续递增序列

674. 最长连续递增序列 - 力扣(LeetCode)

思路:

这个就比较简单了,选或不选的思路就行,dfs(i)表示以nums[i]结尾的最长连续递增子序列

我们nums[i-1]<nums[i]就选nums[i],否则的话就返回个1表示是nums[i]本身这个数是一个长度为1的子序列就好

dfs(i)=dfs(i-1)+1;

1.回溯法

class Solution {
public:int dfs(int i,vector<int>& nums){if(i<0)return 0;if(i>0&&nums[i-1]<nums[i])return dfs(i-1,nums)+1;elsereturn 1;}int findLengthOfLCIS(vector<int>& nums) {int res=0;for(int i=0;i<nums.size();i++)res=max(res,dfs(i,nums));return res;}
};

2.记忆化搜索

老样子还是返回前进行赋值就好

class Solution {
public:int dfs(int i,vector<int>& nums,vector<int>& dp){if(dp[i]!=-1)return dp[i];if(i>0&&nums[i-1]<nums[i])return dp[i]=dfs(i-1,nums,dp)+1;elsereturn dp[i]=1;}int findLengthOfLCIS(vector<int>& nums) {int res=0;vector<int> dp(nums.size(),-1);for(int i=0;i<nums.size();i++)res=max(res,dfs(i,nums,dp));return res;}
};

3.动态规划

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {int res=1;vector<int> dp(nums.size(),1);for(int i=1;i<nums.size();i++){if(nums[i]>nums[i-1])dp[i]=dp[i-1]+1;res=max(res,dp[i]);}return res;}
};

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

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

相关文章

Win10下使用Anaconda安装GPU版本PyTorch

PyTorch是一个开源机器学习框架&#xff0c;最初来自Meta Ai。如果你想研究人工智能或从事人工智能项目方面的工作&#xff0c;那么在本地机器上使用PyTorch设置开发环境对于许多项目来说都是必不可少的。GPU&#xff08;图形处理单元&#xff09;是一种专用处理器&#xff0c;…

灰狼优化算法

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;GWO&#xff09;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学学者Mirjalili等人于2014年提出。该算法灵感来源于灰狼群体的捕食行为&#xff0c;通过模拟灰狼的社会等级分层、跟踪、包围和攻击猎物等步骤来…

Chromium 中sqlite数据库操作演示c++

本文主要演示sqlite数据库 增删改查创建数据库以及数据库表的基本操作&#xff0c;仅供学习参考。 一、sqlite数据库操作类封装&#xff1a; sql\database.h sql\database.cc // Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-sty…

Docker部署Kafka集群,增加 SASL_SSL认证,并集成到Spring Boot,无Zookeeper版

1&#xff0c;准备好Kafka 镜像包&#xff1a; bitnami/kafka:3.9.0 镜像资源包 2&#xff0c;准备好kafka.keystore.jks 和 kafka.truststore.jks证书 具体操作可参考&#xff1a; Docker部署Kafka SASL_SSL认证&#xff0c;并集成到Spring Boot-CSDN博客 3&#xff0c;配置…

apipost下载安装教程、脚本详细使用教程

目录 apipost脚本使用教程 缘由&#xff1a; 实现流程&#xff1a; 1、设置接口需要的URL&#xff1a; 2、boby: 3、预执行操作&#xff1a; 4、断言 5、执行结果&#xff1a; 什么是ApiPost&#xff1f; 下载以及安装&#xff1a; apipost使用文档介绍&#xff1a;…

Python Web 应用开发基础知识

Python Web 应用开发基础知识 引言 随着互联网的快速发展&#xff0c;Web 应用程序的需求日益增加。Python 作为一种简单易学且功能强大的编程语言&#xff0c;已经成为 Web 开发中广受欢迎的选择之一。本文将深入探讨 Python Web 开发的基础知识&#xff0c;包括常用框架、基…

SpringBoot多环境+docker集成企业微信会话存档sdk

SpringBoot多环境docker集成企业微信会话存档sdk 文章来自于 https://developer.work.weixin.qq.com/community/article/detail?content_id16529801754907176021 SpringBoot多环境docker集成企业微信会话存档sdk 对于现在基本流行的springboot环境&#xff0c;官方文档真是比…

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问&#xff0c;到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列&#xff08;蛋白质、有机物、rna、dna、mrna&#xff09;的多模态…

【论文分享】基于街景图像识别和深度学习的针对不同移动能力老年人的街道步行可达性研究——以南京成贤街社区为例

全球老龄化趋势加剧, 许多城市中老年人数量不断增加&#xff0c;而现有街道和社区基础设施往往未能满足其步行安全和便利需求。本次我们给大家带来一篇SCI论文的全文翻译&#xff0c;该论文通过探讨不同步行能力的老年人对城市步行环境的需求&#xff0c;提供了关于如何改善城市…

Android Osmdroid + 天地图 (二)

Osmdroid 天地图 &#xff08;二&#xff09; 前言正文一、定位监听二、改变地图中心三、添加Marker四、地图点击五、其他配置① 缩放控件② Marker更换图标③ 添加比例尺④ 添加指南针⑤ 添加经纬度网格线⑥ 启用旋转手势⑦ 添加小地图 六、源码 前言 上一篇中我们显示了地图…

CSS基础知识04

文本溢出通常是指在限定的空间内不能容纳所输入的文字&#xff0c;导致文字超出了容器的边界 一、文本溢出 1.1.css属性处理 所用到的属性 属性属性值overflowvisible&#xff1a;默认值&#xff0c;内容不会被修剪&#xff0c;会呈现在元素框之外。hidden&#xff1a;内容会…

gitlab和jenkins连接

一&#xff1a;jenkins 配置 安装gitlab插件 生成密钥 id_rsa 要上传到jenkins&#xff0c;id_rsa.pub要上传到gitlab cat /root/.ssh/id_rsa 复制查看的内容 可以看到已经成功创建出来了对于gitlab的认证凭据 二&#xff1a;配置gitlab cat /root/.ssh/id_rsa.pub 复制查…

Modbus TCP转Modbus ASCII解决方案

Modbus TCP和Modbus ASCII是两种不同的通信协议。Modbus TCP是一种二进制协议&#xff0c;Modbus ASCII是一种基于文本的协议。二者不能直接转换&#xff0c;因为它们的数据表示方式、消息结构、字符编码等都不相同。 如果你需要将Modbus TCP转换为Modbus ASCII&#xff0c;你…

十三、注解配置SpringMVC

文章目录 1. 创建初始化类&#xff0c;代替web.xml2. 创建SpringConfig配置类&#xff0c;代替spring的配置文件3. 创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类&#xff0c;代替web.xml 2. 创建SpringConfig配置类&#xff0c;代替spr…

全新升级!立迈胜STMP57系列防水一体化步进伺服电机:IP65+多圈绝对值编码器+EtherCAT通信+内置刹车

在这个科技日新月异的时代&#xff0c;每一步创新都意味着行业的一次飞跃。 回想当初&#xff0c;我们做防水电机的初衷只是因为客户的应用场景涉水&#xff0c;从而定做了IP65防护等级的一体式电机。 后来发现很多客户也有类似的需求&#xff0c;比如机械加工、户外照明、自…

5G CPE:为什么活动会场与商铺的网络成为最新选择

在快节奏的现代社会中&#xff0c;无论是举办一场盛大的活动还是经营一家繁忙的商铺&#xff0c;稳定的网络连接都是不可或缺的基石。然而&#xff0c;面对复杂的布线难题或高昂的商业宽带费用&#xff0c;许多场所往往陷入两难境地。幸运的是&#xff0c;5G CPE&#xff08;Cu…

React-redux 实战案例,自定义useSelector

创建一个新的 React 工程&#xff0c;并配置 Redux 和 Ant Design&#xff0c;你可以按以下步骤操作。我将使用 create-react-app 脚手架工具来快速创建一个基于 TypeScript 的 React 项目 1. 创建新项目 使用 create-react-app 创建一个新的 React 项目&#xff0c;带 TypeS…

【C++】list 类深度解析:探索双向链表的奇妙世界

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 如果你对string&#xff0c;vector还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; 之前文章&#x1f525;&#x1…

uniapp如何i18n国际化

1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖&#xff0c;如果没有可以自行使用如下命令下载&#xff1a; npm install vue-i18n --save 2、创建相关文件 en文件下&#xff1a; zh文件下&#xff1a; index文件下&#xff1a; 3、在main.js中注册&#xff1a…

VScode-Java开发常用插件

中文——界面易读 字体主题——代码可观 头注释——项目信息明了 java开发包——java必备 git协作开发——版本控制