day44.动态规划

news/2024/10/18 9:26:00/

718.最长重复子数组

给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。

 思路:1.确定dp数组(dp table)以及下标的含义:
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。

之后,就和最长子序列很相似了,这个最长重复子数组是用双层for循环,为啥不能从0开始遍历呢,这就和咱们的递归公式有关了,递推公式是dp[i][j]=dp[i-1][j-1]+1,所以i和j就不可以是从0开始了,之后的判断就是如果当前的nums1等于nums2,dp加1,定义变量存储最大值。

class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp(nums1.size()+1,vector<int>(nums2.size()+1,0));int res=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;} res=max(res,dp[i][j]);}}return res;}
};

1143.最长公共子序列

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

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

例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

 思路:dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 

主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同(因为可以是不连续的嘛)

如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。

dp[i][j]是可以从三个方向推导出来的

 而像上一道题,它的递推公式就是只有dp[i-1][j-1],因为他只和左上方向有关联(连续的),而这道题他是不连续的,所以若不相等的话可以根据左方或者上方来取值(也就是下标不同但是字符相同的情况)。

class Solution {
public:int longestCommonSubsequence(string test1, string test2) {vector<vector<int>> dp(test1.size()+1,vector<int>(test2.size()+1,0));int res=0;for(int i=1;i<=test1.size();i++){for(int j=1;j<=test2.size();j++){if(test1[i-1]==test2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}}return dp[test1.size()][test2.size()];}
};


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

相关文章

基于 ASP.NET的教材管理信息系统的设计与实现(最新定制开发,阿龙原创设计)✅

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Sentinel-1 Level 1数据处理的详细算法定义(九)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

TCP丢失时重发为什么倍增重发等待时间(指数退避)

TCP丢失时重发为什么倍增重发等待时间(指数退避)&#xff1f; 因为当一个数据包或确认包在网络传输过程中丢失时&#xff0c;TCP会触发重传机制&#xff0c;也就是重传超时RTO(Retransmission Timeout)&#xff0c;如果重传的数据包在此丢失&#xff0c;TCP的重传的数据包第一…

文字转视频的免费软件有哪些?快来看看视频制作新潮流

在旅途中&#xff0c;每一步都充满了惊喜和故事。想象一下&#xff0c;当你穿梭在古老的城市街巷&#xff0c;或者在海边享受温暖的阳光&#xff0c;每一次的停留和每一个微笑&#xff0c;都值得被记录和分享。 现在&#xff0c;通过使用一键成片的视频软件&#xff0c;你不必…

算法的学习笔记—从 1 到 n 整数中 1 出现的次数(牛客JZ43)

&#x1f600;前言 在编程面试中&#xff0c;求解从 1 到 n 的整数中数字 1 出现的次数是一个常见的挑战。该问题的关键在于如何高效地统计数字 1 出现的次数。本文将详细分析该问题的解题思路&#xff0c;并提供一个高效的 Java 实现。 &#x1f3e0;个人主页&#xff1a;尘觉…

FeignClient-调用流程

调用流程 首先请求会被FeignInvocationHandler 进行拦截&#xff0c;然后dispatch找到应的方法进行调用。 MethodHandler我们看看&#xff1a; 在接口断点会进入下面这个类&#xff1a; 我们可以看到是通过RestTemplage实现的&#xff0c;并且里面有Retryer重试机制。然后方…

MySQL——事务与存储过程(一)事务管理(1)事务的概念

事务处理机制在程序开发过程中有着非常重要的作用&#xff0c;它可以使整个系统更加安全&#xff0c;保证在同一个事务中的操作具有同步性。 现实生活中&#xff0c;人们经常会进行转账操作&#xff0c;转账可以分为两部分来完成&#xff0c;转人和转出&#xff0c;只有这两个部…

【ceph学习】ceph如何进行数据的读写(2)

本章摘要 上文说到&#xff0c;librados/IoctxImpl.cc中调用objecter_op和objecter的op_submit函数&#xff0c;进行op请求的封装、加参和提交。 本文详细介绍相关函数的调用。 osdc中的操作 初始化Op对象&#xff0c;提交请求 设置Op对象的时间&#xff0c;oid&#xff0c…