代码随想录算法训练营第38天 | 第九章动态规划 part11

news/2024/10/17 12:03:03/

文章目录

  • 第九章 动态规划 Part 11
    • 1143. 最长公共子序列
    • 1035. 不相交的线
    • 53. 最大子序和
    • 392. 判断子序列

第九章 动态规划 Part 11

1143. 最长公共子序列

体会一下本题和 718. 最长重复子数组 的区别。
视频讲解:B站视频
题解链接:最长公共子序列题解
结合这两张图进行分析。定义 dp[i][j] 表示 text1 的前 i 个字符和 text2 的前 j 个字符的最长公共子序列长度,不断斜向下判断下能否再加一。不能的话,继承上个或者左边的值。整体难度不大。
在这里插入图片描述
在这里插入图片描述


1035. 不相交的线

其实本题和 1143. 最长公共子序列 是一模一样的,大家可以尝试自己做一做。
视频讲解: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. 最大子序和

这道题我们之前用贪心算法做过,这次我们可以再用动态规划来做一遍。
视频讲解:B站视频
题解链接:最大子序和题解

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

只要知道递归公式:dp[i] = max(dp[i - 1] + nums[i], nums[i]);这题还是挺简单的。当然最难得还是注意最后的结果可不是dp[nums.size() - 1],因为dp[i]保存的是包含
nums[i]后最大子序列和。所以还得挑最大的。


392. 判断子序列

这道题可以算作 编辑距离问题 的入门题目(毕竟这里只是涉及到减法)。慢慢的,后面我们会解决真正的 编辑距离问题。
题解链接:判断子序列题解

class Solution {
public:bool isSubsequence(string s, string t) {if(s.size()>t.size())return false;
vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));for (int i = 1; i <= s.size(); i++) {for (int j = 1; j <= t.size(); j++) {if (s[i - 1] == t[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[s.size()][t.size()]==s.size();}
};

这一题和第一题也是几乎一模一样,挺简单的。改下return 值即可。


http://www.ppmy.cn/news/1539698.html

相关文章

Rust学习如何更有信心?

关于如何学习Rust&#xff0c;在Hacker News上有一篇非常火的教程&#xff0c;作者通过自己的Rust学习经历&#xff0c;向大家指出了一条如何学习Rust的路径。 学习一门编程语言必不可少的是阅读技术书籍和编写代码&#xff0c;要想掌握Rust&#xff0c;两者的交替学习至关重要…

无人机之三维航迹规划篇

一、基本原理 飞行环境建模&#xff1a;在三维航迹规划中&#xff0c;首先需要对飞行环境进行建模。这包括对地形、障碍物、气象等因素进行准确的测量和分析&#xff0c;以获得可行的飞行路径。 飞行任务需求分析&#xff1a;根据无人机的任务需求&#xff0c;确定航迹规划的…

FreeRTOS——中断管理

中断理论剖析 中断简介 中断是一种机制&#xff0c;用于处理高优先级的事件或故障。当一个中断事件发生时&#xff0c;单片机可以立即中断正在执行的程序&#xff0c;转而处理中断事件。这种机制可以提高系统的响应速度和实时性。 中断优先级分组设置 ARM Cortex-M使用了8位宽…

Lumerical学习——资源管理和运行模拟

一、资源管理&#xff08;Resource Manager&#xff09; 在模拟计算前必须对计算资源进行配置。采用资源管理器可以完成这项任务。单击主工具条的“资源&#xff08;Resources&#xff09;”按钮&#xff08;见上图&#xff09;就可以打开资源管理器。通常每个计算机只需设置一…

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中&#xff0c;存储过程是一种预先编写好的SQL代码集合&#xff0c;它被保存在数据库服务器上&#xff0c;可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句&#xff0c;如IF条件语句、WHILE循环等&#xff0c;使…

LeetCode Hot100 | Day5 | 二叉树右视图二叉树展开为链表

LeetCode Hot100 | Day5 | 二叉树右视图&&二叉树展开为链表 文章目录 LeetCode Hot100 | Day5 | 二叉树右视图&&二叉树展开为链表199.二叉树的右视图1.递归遍历2.层序遍历 114.二叉树展开为链表 199.二叉树的右视图 199. 二叉树的右视图 - 力扣&#xff08;Le…

400行程序写一个实时操作系统(九):替换FreeRTOS的内存管理算法

前言 通过前面几章&#xff0c;笔者带领大家完成了内存管理算法的编写。 我们完成的内存管理算法&#xff0c;被称为小内存管理算法。我们也可以将它作为一个库&#xff0c;在后续的嵌入式开发中&#xff0c;使用我们自己编写的malloc&#xff0c;不仅效率会更高&#xff0c;…

目标检测系统中需要【重新训练模型】说明

上百种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09;-CSDN博客 目标检测系统操作说明【用户使用指南】&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09;-CSDN…