(二)最长公共子序列、最长上升子序列、最大子段和、三角形最小路径和、矩阵连乘、0-1背包

news/2025/1/10 13:24:36/

 最近刚考完算法设计分析课的考试,复习总结一下期末考试的几道算法题吧

目录

 LCR 095. 最长公共子序列

 300. 最长递增子序列

53. 最大子数组和

 LCR 100. 三角形最小路径和

矩阵连乘问题

0-1背包


 LCR 095. 最长公共子序列

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace""abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

输入:text1 = "abcde", text2 = "ace" 
输出:3  
解释:最长公共子序列是 "ace" ,它的长度为 3 。

示例 2:

输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc" ,它的长度为 3 。

示例 3:

输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0 。

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;elsedp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}return dp[text1.size()][text2.size()];}
};

 300. 最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7]

子序列

。  

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

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

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

遍历一次数组,当访问到i位置元素时,要对 i 位置前面所有 j 位置元素进行遍历访问,若 j 元素小于 i 元素(能够组成一个上升序列)时,对dp数组进行维护更新,从j遍历到i,维护一个能够构成最大序列的数放入dp数组存储。

dp数组中每一个元素都表示当前位置可以组成最大的上升子序列的元素个数。

class Solution {
public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(), 1);int res = 1; // 注意初始化res的值、初始条件最小字符串长度为1for(int i = 1; i < nums.size(); i++){for(int j = 0; j < i; j++){if(nums[j] < nums[i]){dp[i] = max(dp[j] + 1, dp[i]);}}res = max(res, dp[i]); // 在每轮遍历数组元素维护一个最大的res值}return res;}
};

53. 最大子数组和

给你一个整数数组 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) {vector<int> dp(nums.size()+1, 0);int res = nums[0];for(int i = 1; i <= nums.size(); i++){   // 每一个位置分为 留数组中元素 或者 不留数组中的元素// 俩种情况中选择一个max值dp[i] = max(dp[i-1] + nums[i-1], nums[i-1]);// 用res来维护dp中的最大值res = max(dp[i], res);}return res;}
};

 LCR 100. 三角形最小路径和

 给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 ii + 1

示例 1:

输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:23 46 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

示例 2:

输入:triangle = [[-10]]
输出:-10

提示:

  • 1 <= triangle.length <= 200
  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • -104 <= triangle[i][j] <= 104
class Solution {
public:int minimumTotal(vector<vector<int>>& triangle) {// F[i,j] = triangle[row-1][j]int row = triangle.size();for(int i = row-2; i >= 0; --i){for(int j = 0; j < triangle[i].size(); ++j){triangle[i][j] = min(triangle[i+1][j],triangle[i+1][j+1])+triangle[i][j];}}return triangle[0][0];}
};

矩阵连乘问题

0-1背包

 


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

相关文章

【linux进程间通信(1)】匿名管道和命名管道

目录 前言1. 进程间通信的方法2. 管道的简单介绍3. 匿名管道4. 命名管道5. 总结 前言 众所周知,进程运行是具有独立性的,想要进程间进行通信就要打破这种独立性,而进程间通信的本质其实是让不同的进程看见同一份资源! 本章重点: 本篇文章会介绍进程间通信中常见的几种方式,并…

Kubernetes Gateway API-4-TCPRoute和GRPCRoute

1 TCPRoute 目前 TCP routing 还处于实验阶段。 Gateway API 被设计为与多个协议一起工作&#xff0c;TCPRoute 就是这样一个允许管理TCP流量的路由。 在这个例子中&#xff0c;我们有一个 Gateway 资源和两个 TCPRoute 资源&#xff0c;它们按照以下规则分配流量&#xff1…

Node.js——path(路径操作)模块

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

高级java每日一道面试题-2025年01月04日-并发篇-说说CyclicBarrier和CountDownLatch的区别?

如果有遗漏,评论区告诉我进行补充 面试官: 说说CyclicBarrier和CountDownLatch的区别? 我回答: 在Java高级面试中&#xff0c;CyclicBarrier和CountDownLatch是两个经常被提及的并发工具类&#xff0c;它们都用于实现线程间的同步&#xff0c;但存在显著的区别。以下是对这…

深度学习中的卷积和反卷积(二)——反卷积的介绍

1 简介 反卷积&#xff08;deconvolution&#xff09;又称转置卷积&#xff0c;是卷积的拟操作&#xff0c;常用于GAN等模型中。反卷积是上采样的一种&#xff0c;上采样是指将特征图维度恢复到原始图的维度&#xff0c;这种增大维度的过程被称为上采样。上采样可以用插值或反…

linux音视频采集技术: v4l2

简介 在 Linux 系统中&#xff0c;视频设备的支持和管理离不开 V4L2&#xff08;Video for Linux 2&#xff09;。作为 Linux 内核的一部分&#xff0c;V4L2 提供了一套统一的接口&#xff0c;允许开发者与视频设备&#xff08;如摄像头、视频采集卡等&#xff09;进行交互。无…

毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

JetBrains IDEs和Visual Studio Code的对比

JetBrains IDEs和Visual Studio Code的对比 JetBrains IDEs是捷克JetBrains公司开发的一系列集成开发环境(IDE)。以下是具体介绍:IntelliJ IDEA是JetBrains 公司的一款产品 主要产品 IntelliJ IDEA:一款功能强大且广泛应用的Java集成开发环境,有开源免费的社区版和商业收…