算法学习——LeetCode力扣动态规划篇9(1035. 不相交的线、53. 最大子数组和、392. 判断子序列、115. 不同的子序列)

算法学习——LeetCode力扣动态规划篇9

在这里插入图片描述

1035. 不相交的线

1035. 不相交的线 - 力扣(LeetCode)

描述

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。

现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足:

nums1[i] == nums2[j]
且绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

以这种方法绘制线条,并返回可以绘制的最大连线数。

示例

示例 1:
在这里插入图片描述

输入:nums1 = [1,4,2], nums2 = [1,2,4]
输出:2
解释:可以画出两条不交叉的线,如上图所示。
但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。

示例 2:

输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2]
输出:3

示例 3:

输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1]
输出:2

提示

1 <= nums1.length, nums2.length <= 500
1 <= nums1[i], nums2[j] <= 2000

代码解析

动态规划

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

那么本题就和我们刚刚讲过的这道题目动态规划:1143.最长公共子序列 就是一样一样的了。

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=0 ; i<nums1.size();i++){for(int j=0 ; j<nums2.size();j++){if(nums1[i]==nums2[j])dp[i+1][j+1] = dp[i][j]+1;elsedp[i+1][j+1] = max(dp[i+1][j] , dp[i][j+1]);}}// for(int i=0 ; i<nums1.size();i++)// {//     for(int j=0 ; j<nums2.size();j++)//     {//         cout<<dp[i][j]<<' ';//     }//     cout<<endl;// }return dp[nums1.size()][nums2.size()];}
};

53. 最大子数组和

53. 最大子数组和 - 力扣(LeetCode)

描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组
是数组中的一个连续部分。

示例

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示

1 <= nums.length <= 105
-104 <= nums[i] <= 104

代码解析

贪心算法
class Solution {
public:int maxSubArray(vector<int>& nums) {int sum=0 ,result= INT32_MIN;      //sum是当前数组的和,result是sum中最大的时候for(int i=0 ; i<nums.size() ;i++){sum += nums[i];  //记录当前的sumif(sum > result) result= sum;  //如果sum大于当前result,更新resultif(sum < 0) sum = 0;  //某一个时期的sum小于0舍去}return result;}
};
动态规划
class Solution {
public:int maxSubArray(vector<int>& nums) {vector<int>  dp(nums.size() ,0);int result = INT_MIN;dp[0]= nums[0];for(int i=1 ; i<nums.size() ;i++){dp[i] = max(nums[i],dp[i-1]+nums[i]);}for(int i=0 ; i<nums.size() ;i++) {// cout<<dp[i]<<' ';if(dp[i] > result) result = dp[i];}return result;}
};

392. 判断子序列

392. 判断子序列 - 力扣(LeetCode)

描述

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

进阶

如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

示例

示例 1:

输入:s = “abc”, t = “ahbgdc”
输出:true

示例 2:

输入:s = “axc”, t = “ahbgdc”
输出:false

提示

0 <= s.length <= 100
0 <= t.length <= 10^4
两个字符串都只由小写字符组成。

代码解析

动态规划
class Solution {
public:bool isSubsequence(string s, string t) {if(s.size()==0&&t.size()!=0) return true;if(s.size()==0&&t.size()==0) return true;if(s.size()!=0&&t.size()==0) return false;vector<bool> dp(s.size() , false);int prt = 0;//匹配指针for(int i=0 ; i<t.size() ;i++){if(s[prt] == t[i])//匹配成功标记,匹配下一个{dp[prt] = true;prt++;}}return dp[s.size()-1];}
};

115. 不同的子序列

115. 不同的子序列 - 力扣(LeetCode)

代码描述

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 + 7 取模。

示例

示例 1:

输入:s = “rabbbit”, t = “rabbit”
输出:3
解释:
如下所示, 有 3 种可以从 s 中得到 “rabbit” 的方案。
rabbbit
rabbbit
rabbbit

示例 2:

输入:s = “babgbag”, t = “bag”
输出:5
解释:
如下所示, 有 5 种可以从 s 中得到 “bag” 的方案。
babgbag
babgbag
babgbag
babgbag
babgbag

提示

1 <= s.length, t.length <= 1000
s 和 t 由英文字母组成

代码解析

动态规划
  • 确定dp数组(dp table)以及下标的含义
    dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。

  • 确定递推公式
    这一类问题,基本是要分析两种情况

    • s[i - 1] 与 t[j - 1]相等
      dp[i][j]可以有两部分组成。
      一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。
      一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。
      dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
    • s[i - 1] 与 t[j - 1] 不相等
      dp[i][j] = dp[i - 1][j];
  • dp数组如何初始化

    • dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数。
      那么dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。

    • 再来看dp[0][j],dp[0][j]:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。
      那么dp[0][j]一定都是0,s如论如何也变成不了t。

    • 最后就要看一个特殊位置了,即:dp[0][0] 应该是多少。
      dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。
      在这里插入图片描述

class Solution {
public:int numDistinct(string s, string t) {vector<vector<uint64_t>> dp(s.size()+1 , vector<uint64_t>(t.size()+1,0) );for(int i=1 ; i<s.size()+1 ;i++)dp[i][0] = 1;for(int j=1 ;j<t.size()+1 ;j++)dp[0][j] = 0;dp[0][0] = 1;for(int i=0 ; i<s.size() ;i++){for(int j=0 ;j<t.size();j++){if(s[i]==t[j]) dp[i+1][j+1] = dp[i][j] + dp[i][j+1];else dp[i+1][j+1] = dp[i][j+1];}}return dp[s.size()][t.size()];}
};

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

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

相关文章

matlab使用教程(33)—求解时滞微分方程(1)

1.时滞微分方程(DDE)的分类 时滞微分方程 (DDE) 是当前时间的解与过去时间的解相关的常微分方程。该时滞可以固定不变、与时间相关、与状态相关或与导数相关。要开始积分&#xff0c;通常必须提供历史解&#xff0c;以便求解器可以获取初始积分点之前的时间的解。 1.1常时滞 D…

【MATLAB源码-第176期】基于matlab的16QAM调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在通信系统中&#xff0c;频率偏移是一种常见的问题&#xff0c;它会导致接收到的信号频率与发送信号的频率不完全匹配&#xff0c;进而影响通信质量。在调制技术中&#xff0c;QPSK&#xff08;Quadrature Phase Shift Keyin…

LeetCode每日一题之专题一:双指针 ——复写零

复写零OJ链接&#xff1a;1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 解法&#xff08;原地复写-双指针&#xff09;&#xff1a; 算法思路&#xff1a; 如果「从前向后」进⾏原地复写操作的话&#xff0c;由于 0 的出现会复写两次&#xff0c;导致…

java 数据结构 Map和Set

目录 搜索树 操作-查找 操作-插入 操作-删除&#xff08;难点&#xff09; Map Map 的常用方法 Set 哈希表 哈希函数 哈希冲突 冲突-避免-负载因子调节&#xff08;重点掌握&#xff09; 冲突-解决 冲突-解决-开散列/哈希桶(重点掌握) 实现HashBuck类 put方法 …

linux系统中命令的使用方式和技巧(三)

1.添加、删除组账号&#xff1a;groupadd groupdel groupadd 新建组账号groupdel 删除组账号cat /etc/group 查看用户组信息cat /etc/passwd 查看用户信息 sudo groupadd 新建组账号 2.修改用户所在组&#xff1a;usermod 使用方法&#xff1a;usermod -g 用户组 用户名 sud…

C#清空窗体的背景图片

目录 一、涉及到的知识点 1.设置窗体的背景图 2.加载窗体背景图 3.清空窗体的背景图 二、 示例 一、涉及到的知识点 1.设置窗体的背景图 详见本文作者的其他文章&#xff1a;C#手动改变自制窗体的大小-CSDN博客 https://wenchm.blog.csdn.net/article/details/137027140…

AI结合机器人的入门级仿真环境有哪些?

由于使用真实的机器人开发和测试应用程序既昂贵又费时&#xff0c;因此仿真已成为机器人应用程序开发中越来越重要的部分。在部署到机器人之前在仿真中验证应用程序可以通过尽早发现潜在问题来缩短迭代时间。通过模拟&#xff0c;还可以更轻松地测试在现实世界中可能过于危险的…

C# 登录界面代码

背景 MVVM 是一种软件架构模式&#xff0c;用于创建用户界面。它将用户界面&#xff08;View&#xff09;、业务逻辑&#xff08;ViewModel&#xff09;和数据模型&#xff08;Model&#xff09;分离开来&#xff0c;以提高代码的可维护性和可测试性。 MainWindow 类是 View&a…

【华为OD机试】推荐多样性(JavaPythonC++JS实现)

本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解代码C/C++题解代码JS题解代码四.代码讲解(Ja…

【星计划★C语言】c语言初相识:探索编程之路

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;星计划★C语言、Linux实践室 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️第一个c语言程序二. ⛳️数据类型2.1 &#x1f514;数据单位2.2 &…

JavaScript 高阶函数

高阶函数英文叫Higher-order function。 JavaScript的函数其实都指向某个变量。既然变量可以指向函数&#xff0c;函数的参数能接收变量&#xff0c;那么一个函数就可以接收另一个函数作为参数&#xff0c;这种函数就称之为高阶函数。 一个最简单的高阶函数&#xff1a; functi…

哲♂学家带你深♂入了解动态顺序表

前言&#xff1a; 最近本哲♂学家学习了顺序表&#xff0c;下面我给大家分享一下关于顺序表的知识。 一、什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组 上完成数据的增删查改。 顺序表&#xff…

C++从入门到精通——入门知识

1. C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字 2. 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称都将存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的就是对标识符的名…

qt各种锁使用讲解

在Qt中&#xff0c;主要有以下几种锁的类型&#xff1a; 1. QMutex&#xff08;互斥锁&#xff09;&#xff1a; 是最常见的锁类型&#xff0c;用于实现简单的互斥访问。可以通过lock()和unlock()手动控制锁的加锁和解锁。 QMutexLocker&#xff1a;是一个RAII类&#xff0c;…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(8)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 B站-PS异闻录&#xff1a;萌新系统入门课课程视频 …

2024.3.5力扣每日一题——到达目的地的方案数

2024.3.5 题目来源我的题解方法一 深度优先遍历&#xff08;超时&#xff09;方法二 最短路径算法&#xff08;Dijkstra 算法&#xff09;优先队列 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1976 我的题解 方法一 深度优先遍历&#xff08;超时&#xff09; 从节点…

大模型论文阅读:ADAPTIVE BUDGET ALLOCATION FOR PARAMETEREFFICIENT FINE-TUNING

大模型论文阅读:ADAPTIVE BUDGET ALLOCATION FOR PARAMETEREFFICIENT FINE-TUNING 论文链接:https://arxiv.org/pdf/2303.10512v1.pdf 当存在大量下游任务时,微调所有预训练模型的参数变得不可行。因此,为了以参数高效的方式学习预训练权重的增量更新,提出了许多微调方法,…

【并发编程】CountDownLatch

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳中求进&#xff0c;晒太阳 CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 定义了一个计数器&#xff0c;…

Python大型数据集(GPU)可视化和Pillow解释性视觉推理及材料粒子凝聚

&#x1f3af;要点 P​y​t​ho​n​图像​处理Pillow​库​&#xff1a;&#x1f3af;打开图像、保存图像、保存期间的压缩方式、读取方法、创建缩略图、创建图像查看器。&#x1f3af;获取 RGB 值&#xff0c;从图像中获取颜色&#xff0c;更改像素颜色&#xff0c;转换为黑…

【每日一道算法题】移除链表节点

这里写自定义目录标题 【每日一道算法题】移除链表元素思路记录我的代码力扣官方题解递归迭代 【每日一道算法题】移除链表元素 力扣题目链接(opens new window) 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xf…