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

最长公共子序列

Alt
dp[i][j] 表示字符串1中 [0, i-1] 子串与字符串2中 [0, j-1] 子串之间的最长公共子序列长度。注意这里并不要求公共子序列一定以下标 i-1 或 j-1 结尾。因为这里的公共子序列不必须连续,这样定义可以使得递推方便一些
当进行遍历递推时,无非有text1[i-1] == text2[j-1]text1 != text2[j-1]两种情况。如果相等,自然dp[i][j] = dp[i - 1][j - 1] + 1;如果不相等,则应该从 dp[i-1][j] 和 dp[i][j-1] 中挑更大的那一个(因为不要求公共序列连续)
初始化借鉴了昨天的题目,在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()];}
};

不相交的线

Alt
直线不能相交,这就是说明在序列1中找到一个与序列2相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。直线的数目等于两个序列之间的最长公共子序列长度。

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()];}
};

最大子序和

Alt
这道题之前已经通过贪心算法解决过一次了,局部上保证每一次累加得到的都是正值,如果遇到负值则将累加和置0重新开始累加,因为负值只会使总和变小。

class Solution {
public:int maxSubArray(vector<int>& nums) {int count = 0;int result = INT_MIN;for(int i = 0; i < nums.size(); i++) {count += nums[i];if(count > result) {result = count;}if(count < 0) {count = 0;}}return result;}
};

动态规划法

dp[i] 表示以 nums[i] 结尾的所有连续子数组的最大和。
在递推时只需要考虑要不要继续累加,还是重新开始加。dp[i] = max(dp[i - 1] + nums[i], nums[i])。
初始化dp[0],其最大和只能为nums[0],dp[0] = nums[0]。
由于每次计算的都是必须以该下标结尾的子数组的最大和,所以最终结果要取dp数组中的最大值,考虑每个位置结尾的子数组。

class Solution {
public:int maxSubArray(vector<int>& nums) {// dp[i]表示以nums[i]结尾的所有子数组和的最大值vector<int> dp(nums.size(), 0);dp[0] = nums[0];int result = dp[0];  // 注意这里初始化为dp[0],不然就把dp[0]落下了for(int i = 1; i < nums.size(); i++) {dp[i] = max(dp[i - 1] + nums[i], nums[i]);if(dp[i] > result) {result = dp[i];}}return result;}
};

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

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

相关文章

excel合并多列单元格并保留数据

Sub 合并多个单元格并保留数据()Dim rng As RangeDim val As StringDim cell As RangeSet rng SelectionIf rng.Cells.Count < 1 ThenExit SubEnd IfApplication.ScreenUpdating FalseApplication.DisplayAlerts FalseFor Each cell In rngIf cell.Value <> "…

U盘重装MAC OS遇到 无法识别文件系统和磁盘无法读取问题

一台windows的电脑&#xff0c;一个差不多够大的U盘我这里差不多用了13G左右。 .dmg文件好难搞&#xff0c;不是难下&#xff0c;是下载转载后无法识别&#xff0c;所以很需要 带引导的os文件. 一个windows下dmg镜像恢复工具&#xff0c;这里用的是TransMac 10.4 &#xff0c;…

深入浅出 Python 类与对象

Python 是一种面向对象的编程语言,这意味着我们可以使用类(class)和对象(object)来组织和操作数据。在本文中,我们将详细介绍 Python 中的类与对象,以及它们的相关概念和用法。 一、类与对象的基本概念 类是面向对象编程中的一个关键概念,它是具有相同属性和方法的对…

三防平板丨手持工业平板丨ONERugged工业三防平板丨推动数字化转型

随着科技的发展&#xff0c;数字化转型已经成为企业转型升级的必由之路。而在数字化转型中&#xff0c;三防平板作为一种重要的工具&#xff0c;可以极大地推动企业的数字化转型。本文将从以下几个方面探讨三防平板如何推动数字化转型。 一、提高工作效率 ONERugged加固平板的…

Web自动化测试基础篇

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一…

设计模式----单例模式

单例模式 只生成一个对象实例&#xff0c;减少了系统的开销&#xff1b;方便数据访问。 保证一个类只有一个实例&#xff0c;并且提供一个访问该实例的全局访问点。 系统中如果一个类仅有一个实例&#xff0c;可以用来存储数据。全局访问 单例实现 1、将该类的构造方法定义为…

shopify如何在元字段中使用元对象

在Shopify中&#xff0c;您可以使用元字段&#xff08;Metafields&#xff09;来存储和管理自定义的附加数据。元字段允许您在产品、变体、订单和其他实体中添加额外的信息&#xff0c;以满足特定的业务需求。而元对象&#xff08;Metaobject&#xff09;是指在元字段中存储的实…

Cell |从实验室到田间,还有多远?

期刊&#xff1a;Cell 时间&#xff1a;2023年8月 植物微生物群是指植物表面、细胞间隙、器官内寄生的细菌、真菌、病毒、古菌群落。植物与微生物群的互作在植物生理、生态和进化过程中扮演重要角色。有益微生物定殖植物&#xff0c;可以持续对植物生产力产生表型效应&…

Django学习记录03——员工部门案例

1、项目初始化 1.1 项目创建 1.2 APP的创建 1.2.1 方法一 命令配置 python manage.py startapp app011.2.2 方法二 Pycharm配置 在Django Structure 中创建APP 2.设计表结构 2.1 表结构 注意&#xff1a; 1.员工表与部门表关联时id关联 节省存储&#xff0c;但是查找耗时…

2024信息工程、软件与计算机工程国际会议(ICIESCE2024)

2024信息工程、软件与计算机工程国际会议&#xff08;ICIESCE2024) 会议简介 随着互联网的不断创新&#xff0c;信息工程、软件和计算机工程在各个领域得到了广泛应用。为了为来自世界各地的专家学者提供一个分享通信和计算机工程领域研究成果的平台&#xff0c;2024年信息工…

Linux(四)__用户和用户组管理

介绍 Linux系统是一个多用户多任务的分时操作系统。 Linux 系统支持多个用户在同一时间内登陆&#xff0c;不同用户可以执行不同的任务&#xff0c;并且互不影响。不同用户具有不问的权限&#xff0c;毎个用户在权限允许的范围内完成不间的任务&#xff0c;Linux 正是通过这种…

Leetcode刷题笔记题解(C++):203. 移除链表元素

思路&#xff1a;不同的情况出现了&#xff0c;就是第一个节点要是为等于val的节点&#xff0c;可以新建一个节点&#xff0c;并next指向head&#xff0c;这样就可以遍历新的链表来删除节点 /*** Definition for singly-linked list.* struct ListNode {* int val;* L…

MSSQL运用

做过的事情&#xff0c;隔几年又再做相同的事情&#xff0c;做一下记录。 角色与权限 创建账号与设定执行存储过程权限 Use testDB CREATE LOGIN acct WITH PASSWORDp1 CREATE USER acct FOR LOGIN acct GO GRANT EXECUTE ON SP_Test TO acct; GO 存储过程 调用写好的SQL语…

【水文】qsort排序

#include <stdio.h> #include <stdlib.h> // 比较函数&#xff0c;用于qsort排序 int compare(const void *a, const void *b) { return *(int *)a - *(int *)b; } int main() { int arr[] {9, 5, 7, 3, 1}; int size sizeof(arr) / sizeof(int); printf(&quo…

Java最全面试总结——5. MyBatis篇

1、什么是MyBatis &#xff08;1&#xff09;Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直…

四个ChatGPT在学术论文写作中的要点!【建议收藏】

在论文写作过程中&#xff0c;写作不仅是一种表达&#xff0c;更是一种艺术。论文写作是一项复杂而精细的任务&#xff0c;它要求作者不仅能清晰地传达思想&#xff0c;还要能够精确地界定研究范围和问题。这是一个充满挑战的过程&#xff0c;特别是当你试图将那些盘旋在脑海中…

深度解析Sora的核心技术

Sora要解决的核心问题 Sora面临的挑战是将不同类型的视觉信息&#xff0c;如视频、文本、图像和声音等&#xff0c;整合为一种共同的表征形式。这种转换是实现统一训练过程的关键&#xff0c;旨在将各类数据集中到一个训练框架中&#xff0c;以便于进行大规模的统一学习。简而…

http 和 https 的区别?

目录 1.http 和 https 的基本概念 2.http 和 https 的区别 3.https 协议的工作原理 4.https 协议的优点 5.https 协议的缺点 1.http 和 https 的基本概念 http: 超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和…

穿越时空的命令行:TELNET的历史、原理与未来展望

引言 TELNET&#xff0c;代表"远程终端协议"&#xff0c;是一种允许用户通过互联网或局域网在本地计算机上登录并操作远程计算机的协议。它提供了一种简单的方式来访问远程服务器&#xff0c;执行命令并管理资源&#xff0c;是早期互联网重要的通信协议之一。 TELN…

lodash库中的函数处理嵌套的对象和数组的函数

import { isArray, camelCase, isObject, snakeCase, transform } from lodash-es;const toSnakeCase obj > transform(obj, (acc, value, key, target) > {const camelKey isArray(target) ? key : snakeCase(key);acc[camelKey] isObject(value) ? toSnakeCase(va…