算法DAY52 动态规划10 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

news/2024/12/5 8:10:39/

300.最长递增子序列

五部曲:
1、dp数组的含义:
dp[ i ] : 代表 截至到nums[i] (包括 nums[i]) 的序列中,以nums[i] 结尾的,最长递增子序列的长度。这里强调以nums[i] 结尾,是因为还要跟nums[j]做对比,确定是不是递增的。
2、递推公式
if(nums[i] > nums[j]) dp = max(dp[i],dp[j]+1)
注意:dp[i] 随着j可能会变化多次,所以其实是在取满足条件的 dp[j]+1的最大值
3、初始化
对于每一个单独的nums[i],连续子序列都是1
4、遍历顺序
j从0~i-1,无所谓前后。但是dp[i] 依赖于dp[i-1],所以必须从前向后遍历
5、举例推导
在这里插入图片描述

class Solution {
public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),1);int res = 0;for(int i = 1; i < nums.size(); ++i){for(int j = 0; j < i; ++j){if(nums[i] > nums[j])dp[i] = max(dp[i],dp[j]+1);}if(dp[i] > res) res = dp[i];}return res == 0 ? 1 : res;}
};

674. 最长连续递增序列

本题可以直接用暴力写出来。

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {int res = 0;int count = 1;for(int i = 1; i< nums.size(); ++i ){if(nums[i] > nums[i-1]){count++;if(count > res) res = count;continue;}else{count = 1;}}return res == 0 ? 1 : res;}
};

动态规划:
1、dp[i] : 以nums[i]结尾的序列,最长连续递增子序列的长度
2、递推公式
因为要是连续子序列,所以只能是当dp[i] > dp[i-1] 时,dp[i] = dp[i-1] + 1;
3、初始化
都是1
4、遍历顺序
从前向后

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {vector<int> dp(nums.size(),1);int res = 1;for(int i = 1; i < nums.size(); ++i){if(nums[i] > nums[i-1]) dp[i] = dp[i-1] + 1;if(dp[i] > res) res = dp[i];}return res;}
};

718. 最长重复子数组

1、dp[i][j] : 以A[i-1], B[j-1]为结尾的A B字符串的最大重复子序列。
不定义成以A[i], B[j]为结尾的A B字符串的最大重复子序列,是因为会多一步初始化的步骤,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,同理。

// 要对第一行,第一列经行初始化for (int i = 0; i < nums1.size(); i++) if (nums1[i] == nums2[0]) dp[i][0] = 1;for (int j = 0; j < nums2.size(); j++) if (nums1[0] == nums2[j]) dp[0][j] = 1;

而 以A[i-1], B[j-1]为结尾的A B字符串的最大重复子序列这种定义里,dp[i][0], dp[0][j] 是无意义的 。但是依然需要初始化为0,因为会依赖i-1,j-1。假设A[0] = B[0],dp[1][1] = dp[0][0] + 1。

不太好理解,还是看 : 以A[i], B[j]为结尾的A B字符串的最大重复子序列,这个定义。
2、递推公式

if (nums1[i] == nums2[j] && i > 0 && j > 0) { // 防止 i-1 出现负数dp[i][j] = dp[i - 1][j - 1] + 1;
}

3、初始化
在定义中已经提及
4、遍历顺序
从前向后

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

其中两层for都要从0开始,因为要把dp[i][0] dp[0][j] 的最大值给到res


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

相关文章

106.(cesium篇)cesium椎体旋转

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <html lang="en"> <

互联网摸鱼日报(2023-05-08)

互联网摸鱼日报&#xff08;2023-05-08&#xff09; InfoQ 热门话题 数据库内核杂谈&#xff08;三十二&#xff09;- 杂谈五周年特别篇 比Python快35000倍&#xff01;LLVM&Swift之父宣布全新编程语言Mojo&#xff1a;编程被颠覆了 李彦宏回应文心一言与ChatGPT差距2个…

【Vue学习笔记4】基于Vue3的Composition API + <script setup>

继续前面的学习笔记。 1. 写一个累加器组件 在 src 下的 components 目录下新建一个 Counter.vue &#xff0c;并在这个文件里写出下面的代码&#xff1a; <template><div><h1 click"add">{{ count }}</h1></div> </template>…

代码随想录刷题-栈与队列-删除字符串中的所有相邻重复项

文章目录 删除字符串中的所有相邻重复项习题栈string实现 删除字符串中的所有相邻重复项 本节对应代码随想录中&#xff1a;代码随想录&#xff0c;对应视频链接为&#xff1a;暂无 习题 题目链接&#xff1a;1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCod…

第三章数据链路层

1.数据链路层的概述 1.0地位 数据链路层在网络体系结构中所处的地位 链路(Link)就是从一个结点到相邻结点的一段物理线路&#xff0c;而中间没有任何其他的交换结点。数据链路(Data Link)是指把实现通信协议的硬件和软件加到链路上&#xff0c;就构成了数据链路。数据链路层以帧…

Mac安装docker

一、docker是什么&#xff1f; 1、Docker的三个基本概念: Image(镜像)Container(容器)Repository(仓库) Docker的思想来自于集装箱&#xff0c;集装箱解决了什么问题&#xff1f; 在一艘大船上&#xff0c;可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了&a…

【网络】-- IP协议

应用层&#xff08;http、https&#xff09;&#xff1a; 数据的使用。传输层&#xff08;UDP、TCP&#xff09;&#xff1a;网络通讯的细节&#xff0c;将数据可靠的从A主机跨网络送到B主机。网络层&#xff08;IP&#xff09;&#xff1a;提供一种能力&#xff0c;将数据从A主…

Linux搭建我的世界MC服务器 - MCSM面板 【外网远程联机教程】

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 Linux使用MCS…