代碼隨想錄算法訓練營|第五十五天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和。刷题心得(c++)

讀題

1143.最长公共子序列

自己看到题目的第一想法

看起來跟最長重複子数組很類似,但是要怎麼去推遞推的狀態沒有想法

看完代码随想录之后的想法

看完之後,大概釐清了整體想法,可以想成說,因為我們要考慮的是不連續的子序列,所以會分成兩種狀態,一個是不相同,不相同的話需要看之前的序列有沒有重複,之前包括兩個方面,縱向與橫向關係,要取最大的,因為這個緣故,在相同的時候,因為之前的數都考慮過縱向與橫向的關係,可以直接從左上角跟重複子序列一樣,求出該值。 至於初始化的部分,在定義下標時,i、j都設定為i - 1 或者說 1 ~ i ,讓後續的遞推公式以及初始化都可以比較簡便。

1035.不相交的线

自己看到题目的第一想法

看到這題,看到卡哥的提示,觀察過後其實就跟最長的公共子序列一樣,如果有一個子序列是共有的,那最長的公共子序列一定是可以連接最多不相交的線,整體的概念是一致的。

53. 最大子序和

看完代码随想录之后的想法

其實整體概念跟連續遞增子序有點像,改為將数組變動 dp[i - 1] + nums[i] 以及 nums[i]的差異,看完程式碼後理解上不會太過於困難。

1143.最长公共子序列 - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[i][j] 代表 0~ i - 1 的text1 以及 0 ~ j - 1 的text2 最长公共子序列長度為dp[i][j]

  2. 遞推公式

    分成兩種狀態相同與不相同

    不相同的話需要看之前的序列有沒有重複,之前包括兩個方面,縱向與橫向關係,要取最大的

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

    相同的時候,因為之前的數都考慮過縱向與橫向的關係,可以直接從左上角跟重複子序列一樣

    dp[i][j] = dp[i - 1][j - 1] + 1;

  3. 根據遞推公式、題意以及定義,確定DP數組如何初始化

    最少為0,所以初始化為0

  4. 確定遍歷順序

    因為需要左上角的數據來進行遍歷,所以是由前往後。

Code

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() + 1; i++) {for(int j = 1; j < text2.size() + 1; 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.不相交的线 - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[i][j] 代表 0~ i - 1 的nums1 以及 0 ~ j - 1 的nums2 最长不相交的线為dp[i][j]

  2. 遞推公式

    分成兩種狀態相同與不相同

    不相同的話需要看之前的序列有沒有重複,之前包括兩個方面,縱向與橫向關係,要取最大的

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

    相同的時候,因為之前的數都考慮過縱向與橫向的關係,可以直接從左上角跟重複子序列一樣

    dp[i][j] = dp[i - 1][j - 1] + 1;

  3. 根據遞推公式、題意以及定義,確定DP數組如何初始化

    最少為0,所以初始化為0

  4. 確定遍歷順序

    因為需要左上角的數據來進行遍歷,所以是由前往後。

Code

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() + 1; i++) {for(int j = 1; j < nums2.size() + 1; 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[i] 代表 i 之前包含i 的number[i] 結尾的最大子序和是多少

  2. 遞推公式

    當前的数加上前面的數比較大還是當前的數比較大,取大的。

    dp[i] = max(dp[i - 1] + nums[i], nums[i])

    if dp [i] > result 更新result

  3. 根據遞推公式、題意以及定義,確定DP數組如何初始化

    將數組初始化為最小值,以及result = nums[0]

  4. 確定遍歷順序

    0 到 i 因為需要前面的數據來進行遍歷,所以是由前往後。

Code

class Solution {
public:int maxSubArray(vector<int>& nums) {vector<int> dp (nums.size() + 1, INT_MIN);int result = nums[0];dp[0] = nums[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;}
};

總結

自己实现过程中遇到哪些困难

一開始對於最長公共子序列不太了解,但看完講解後,其實就是在重複子序列的基礎上考慮橫向與縱向的關係,以及最大子序和整體很像最長連續子序列,只是思考上需要進行轉換﹐整體而言,今天題目主要是思路上需要做一些改變,不然很容易繞進去。

今日收获,记录一下自己的学习时长

今天大概學習了2hr,整體是很充實的,尤其理解最長公共子序列,在想法上接續到的二題不相交的線就會非常清晰。

相關資料

● 今日学习的文章链接和视频链接

1143.最长公共子序列

视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili

https://programmercarl.com/1143.最长公共子序列.html

1035.不相交的线

视频讲解:动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线_哔哩哔哩_bilibili

https://programmercarl.com/1035.不相交的线.html

53. 最大子序和

视频讲解:看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和_哔哩哔哩_bilibili

https://programmercarl.com/0053.最大子序和(动态规划).html

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

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

相关文章

Jetpack:025-Jetpack中的多点触控事件

文章目录 1. 概念介绍2. 使用方法2.1 缩放事件2.2 旋转事件2.3 平移事件2.4 综合事件 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中滚动事件相关的内容&#xff0c;本章回中主要介绍 多点解控事件。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xf…

尚硅谷-kubernetes

目录 一、kubernetes概述1、kubernetes基本介绍**2、kubernetes 功能和架构** 一、kubernetes概述 1、kubernetes基本介绍 kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替 8 个字符“ubernete”而成的缩写 kubernetes是一个开源的&#xff0c;用于管理云平台中多个…

HTML基本概念:

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 1&#xff09;、HTML 是用来描述网页的一种语言。 2&#xff09;、HTML 不是一种编程语言&am…

笔记本电脑搜索不到wifi6 无线路由器信号

路由器更换成wifi6 无线路由器后&#xff0c;手机能搜索到这个无线信号&#xff0c;但是笔记本搜索不到这个无线信号&#xff0c;后网上搜索后发现是无线网卡驱动问题&#xff0c;很多无线网卡使用的是Intel芯片&#xff0c;Intel就此发布了公告&#xff0c;升级驱动就可以彻底…

我和云栖有个约会

开端&#xff0c;似曾相识的云栖 2023年阿里云云栖大会在云栖小镇举办&#xff0c;云栖小镇&#xff1f;在2020年的时候&#xff0c;曾经来过这里参加竞赛。时隔三年&#xff0c;身份变换&#xff0c;以开发者的身份&#xff0c;收到阿里云开发者社区的邀请&#xff0c;正好有…

linux 报错

输入 pip install -U openmim报错 有可能是服务器在其他国家&#xff0c;需要手动设置 把这三行复制到~/.bashrc里 export http_proxyhttp://127.0.0.1:3128 export https_proxy${http_proxy} export ftp_proxy${http_proxy}source ~/.bashrc

第57篇-某钩招聘网站加密参数分析【2023-10-31】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析1.X-S-HEADER参数2.请求参数data3.响应机密值data一、前言 网址: aHR0cHM6Ly93d3cubGFnb3UuY29t…

[NSSRound#6 Team]check(Revenge)

文章目录 考点tarfile文件覆盖漏洞&#xff08;CVE-2007-4559&#xff09;PIN码计算 解题过程非预期解预期解 考点 tarfile文件覆盖漏洞&#xff08;CVE-2007-4559&#xff09; Python 中 tarfile 模块中的extract、extractFile和extractall 函数中的目录遍历漏洞 允许 用户协…

`.NET Web`新人入门必学项目`EarthChat`

.NET Web新人入门必学项目EarthChat EarthChat是一个基于.NET 7的实战项目&#xff0c;EarthChat提供了很多的最佳实践&#xff0c;EarthChat的目标也是成为一个很多人都喜欢的大型聊天业务系统&#xff0c;并且将结合SKAI大模型进行打造智能业务系统&#xff0c;在EarthChat中…

Pytorch 文本情感分类案例

一共六个脚本,分别是: ①generateDictionary.py用于生成词典 ②datasets.py定义了数据集加载的方法 ③models.py定义了网络模型 ④configs.py配置一些参数 ⑤run_train.py训练模型 ⑥run_test.py测试模型 数据集https://download.csdn.net/download/Victor_Li_/88486959?spm1…

力扣707.设计链表

原题链接&#xff1a;力扣707.设计链表 全代码&#xff1a; class MyLinkedList { public:// 定义链表节点结构体struct LinkedNode {int val;LinkedNode* next;LinkedNode(int val):val(val), next(nullptr){}};// 初始化链表MyLinkedList() {_dummyHead new LinkedNode(0)…

narak靶机攻略

narak靶机攻略 扫描 渗透 cewl http://10.4.7.158 > use1.txthydra -L use1.txt -P use1.txt http-get://10.4.7.158/webdav -V -t 50 -fyamdoot:Swargcadaver http://10.4.7.158/webdav<?php $ip10.4.7.158; $port12138; $sock fsockopen($ip, $port); $descriptors…

识别flink的反压源头

背景 flink中最常见的问题就是反压&#xff0c;这种情况下我们要正确的识别导致反压的真正的源头&#xff0c;本文就简单看下如何正确识别反压的源头 反压的源头 首先我们必须意识到现实中轻微的反压是没有必要去优化的&#xff0c;因为这种情况下是由于偶尔的流量峰值,Task…

JavaScript的高级概述

还记得我们刚刚开始的时候给JavaScript的定义吗&#xff1f; JavaScript是一种高级的&#xff0c;面向对象的&#xff0c;多范式变成语言&#xff01; 这种定义JavaScript只是冰山一角&#xff01; JavaScript的高级定义 JavaScript是一种高级的、基于原型的、面向对象、多范…

网络协议--TCP的保活定时器

23.1 引言 许多TCP/IP的初学者会很惊奇地发现可以没有任何数据流通过一个空闲的TCP连接。也就是说&#xff0c;如果TCP连接的双方都没有向对方发送数据&#xff0c;则在两个TCP模块之间不交换任何信息。例如&#xff0c;没有可以在其他网络协议中发现的轮询。这意味着我们可以…

centos英伟达驱动安装

1、预安装操作 1.1. Verify You Have a CUDA-Capable GPU lspci | grep -i nvidia 1.2. Verify You Have a Supported Version of Linux uname -m && cat /etc/*release1.3. Verify the System Has gcc Installed gcc --version1.4. Verify the System…

Node.js的基本概念node -v 和npm -v 这两个命令的作用

Node.js 是一个开源且跨平台的 JavaScript 运行时环境&#xff0c;它可以让你在服务器端运行 JavaScript 代码。Node.js 使用了 Chrome 的 V8 JavaScript 引擎来执行代码&#xff0c;非常高效。 在 Node.js 出现之前&#xff0c;JavaScript 通常只在浏览器中运行&#xff0c;用…

第 369 场 LeetCode 周赛题解

A 找出数组中的 K-or 值 模拟 class Solution { public:int findKOr(vector<int> &nums, int k) {vector<int> cnt(32);for (auto x: nums)for (int i 0; i < 32; i)if (x >> i & 1)cnt[i];int res 0;for (int i 0; i < 32; i)if (cnt[i] &…

uniapp 开发微信小程序 v-bind给子组件传递函数,该函数中的this不是父组件的二是子组件的this

解决办法&#xff1a;子组件通过缓存子组件this然后&#xff0c;用bind改写this 这个方法因为定义了全局变量that 那么该变量就只能用一次&#xff0c;不然会有赋值覆盖的情况。 要么就弃用v-bind传入函数,改为emit传入自定义事件 [uniapp] uview(1.x) 二次封装u-navbar 导致…

ubuntu配置 Conda 更改默认环境路径

我的需求是以后凡是新建一个虚拟环境都需要安装在一个挂载了大容量的分区/data里面 /home里面的是即将爆满但是还能塞点东西的硬盘. 如果您想要永久更改 Conda 的默认环境路径&#xff0c;可以编辑 Conda 的配置文件。首先&#xff0c;找到 Conda 的配置文件通常是 .condarc 文…