代码随想录算法训练营Day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和

本文主要是介绍代码随想录算法训练营Day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1143.最长公共子序列

前言

思路

算法实现 

1035.不相交的线

前言

思路

算法实现

53. 最大子序和

前言

思路

算法实现

总结


1143.最长公共子序列

题目链接

文章链接

前言

         本题与上一题最长公共子数组类似,只是上一题要求连续,而本题没有这个要求。

思路

        利用动规五部曲进行分析:

1.确定dp数组及其下标含义:

        dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j];

2.确定递推公式:

        主要分为两种情况:

        ①text1[i - 1] 与text2[j - 1]相同时,则找到了一个连续的公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;

        ②text[i - 1]与text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。

        即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

3.初始化dp数组:

        对于dp[i][0]和dp[0][j]本身没有意义,可以初始化为0,其他下标的初始对于结果没有影响,为了方便可以全部初始化为0;

4.确定遍历顺序:

       从递推公式,可以看出,有三个方向可以推出dp[i][j],如图:

5.打印dp数组:

        以输入:text1 = "abcde", text2 = "ace" 为例,dp状态如图:

 

算法实现 

class Solution {
public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size() + 1, vector<int> (text2.size() + 1, 0));for (int i = 1; i <= text1.size(); i++) {for (int j = 1; j <= text2.size(); j++) {if (text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}return dp[text1.size()][text2.size()];}
};

1035.不相交的线

题目链接

文章链接

前言

         本题的难点在于审题,要把题目想要表达的意思理解了,要明白题目的本质就是要求最长公共子序列。

思路

        直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。

        本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!

        因此算法实现与上一题相同。

算法实现

class Solution {
public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp(nums1.size() + 1, vector<int> (nums2.size() + 1, 0));for (int i = 1; i <= nums1.size(); i++) {for (int j = 1; j <= nums2.size(); j++) {if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}return dp[nums1.size()][nums2.size()];}
};

53. 最大子序和

题目链接

文章链接

前言

         上一次遇到本题还是在贪心算法的章节,利用贪心算法巧妙地实现,这次利用动态规划的方法进行求解。

思路

        利用动规五部曲进行分析:

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

        本题考虑的对象只有一个数组,因此可以仅创建一个一维的dp数组。

        dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]

2.确定递推公式:

        dp[i]只有两个方向可以推出来:

  • dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
  • nums[i],即:从头开始计算当前连续子序列和

        一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);

3.初始哈dp数组:

        根据dp[i]的定义,很明显dp[0]应为nums[0]即dp[0] = nums[0]。

4.确定遍历顺序:

        递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历。

5.打印dp数组:

        以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下:

         我们要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列,而不是最后一个。

算法实现

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

总结

        今天主要还是练习子序列问题,明天继续,早日结束动态规划专题!

这篇关于代码随想录算法训练营Day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/701763

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.