代码学习记录42---动态规划

随想录日记part42

t i m e : time: time 2024.04.14



主要内容:今天开始要学习动态规划的相关知识了,今天的内容主要涉及:最长递增子序列 ;最长连续递增序列 ;最长重复子数组 ;最长公共子序列;不相交的线 ;最大子序和动态规划

  • 300.最长递增子序列
  • 674. 最长连续递增序列
  • 718. 最长重复子数组
  • 1143.最长公共子序列
  • 1035.不相交的线
  • 53. 最大子序和动态规划


动态规划五部曲:
【1】.确定dp数组以及下标的含义
【2】.确定递推公式
【3】.dp数组如何初始化
【4】.确定遍历顺序
【5】.举例推导dp数组

Topic1最长递增子序列

在这里插入图片描述

思路:

接下来进行动规五步曲:
1.确定dp数组以及下标的含义:
dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
2.确定递推公式:

//位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);

3.dp数组如何初始化

 Arrays.fill(dp, 1);

4.确定遍历顺序
从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。
5.举例推导dp数组
输入:[0,1,0,3,2],dp数组的变化如下:
在这里插入图片描述
代码如下:

class Solution {public int lengthOfLIS(int[] nums) {int len = nums.length;// dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度int[] dp = new int[len];Arrays.fill(dp, 1);if (len == 1)return 1;dp[0] = 1;int max_value = 1;for (int i = 1; i < len; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j])dp[i] = Math.max(dp[j] + 1, dp[i]);}max_value = Math.max(max_value, dp[i]);}return max_value;}
}

时间复杂度 O ( n 2 ) O(n^2) O(n2)
空间复杂度 O ( n ) O(n) O(n)



Topic2最长连续递增序列

题目:
在这里插入图片描述

思路:

接下来进行动规五步曲:
1.确定dp数组以及下标的含义:
dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
2.确定递推公式:

if(nums[i]>nums[i-1])dp[i]=dp[i-1]+1;

3.dp数组如何初始化

 Arrays.fill(dp, 1);

4.确定遍历顺序
从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。
5.举例推导dp数组
已输入nums = [1,3,5,4,7]为例,dp数组状态如下:
在这里插入图片描述

class Solution {public int findLengthOfLCIS(int[] nums) {int len = nums.length;int[] dp = new int[len];Arrays.fill(dp, 1);int result = 1;for (int i = 1; i < len; i++) {if (nums[i] > nums[i - 1]) {dp[i] = dp[i - 1] + 1;}result = Math.max(result, dp[i]);}return result;}
}

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( n ) O(n) O(n)



Topic3最长重复子数组

题目:
在这里插入图片描述

思路:

接下来进行动规五步曲:
1.确定dp数组以及下标的含义:
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 (特别注意: “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 )
2.确定递推公式:
根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;根据递推公式可以看出,遍历i 和 j 要从1开始!
3.dp数组如何初始化

 for(int i=0;i<=nums1.length;i++) dp[i][0]=0;for(int i=0;i<=nums2.length;i++) dp[0][i]=0;

4.确定遍历顺序
外层for循环遍历A,内层for循环遍历B。
5.举例推导dp数组
拿示例1中,A: [1,2,3,2,1],B: [3,2,1,4,7]为例,画一个dp数组的状态变化,如下:
在这里插入图片描述

class Solution {public int findLength(int[] nums1, int[] nums2) {// dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 (特别注意: “以下标i -1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 )int[][] dp = new int[nums1.length + 1][nums2.length + 1];for (int i = 0; i <= nums1.length; i++)dp[i][0] = 0;for (int i = 0; i <= nums2.length; i++)dp[0][i] = 0;int result = 0;for (int i = 1; i < nums1.length + 1; i++) {for (int j = 1; j < nums2.length + 1; j++) {if (nums1[i - 1] == nums2[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;result = Math.max(result, dp[i][j]);}}return result;}
}


Topic4最长公共子序列

题目:
在这里插入图片描述

思路:

接下来进行动规五步曲:
1.确定dp数组以及下标的含义:
dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]
2.确定递推公式:
主要就是两大情况:1.text1[i - 1] 与 text2[j - 1]相同 2.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] = max(dp[i - 1][j], dp[i][j - 1]);
3.dp数组如何初始化

 for(int i=0;i<=nums1.length;i++) dp[i][0]=0;for(int i=0;i<=nums2.length;i++) dp[0][i]=0;

4.确定遍历顺序
外层for循环遍历A,内层for循环遍历B。
5.举例推导dp数组
以输入:text1 = “abcde”, text2 = “ace” 为例,dp状态如图:
在这里插入图片描述

class Solution {public int longestCommonSubsequence(String text1, String text2) {int len1 = text1.length();int len2 = text2.length();int[][] dp = new int[len1 + 1][len2 + 1];for (int i = 0; i <= len1; i++)dp[i][0] = 0;for (int i = 0; i <= len2; i++)dp[0][i] = 0;int result = 0;for (int i = 1; i < len1 + 1; i++) {for (int j = 1; j < len2 + 1; j++) {if (text1.charAt(i - 1) == text2.charAt(j - 1))dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);result = Math.max(result, dp[i][j]);}}return result;}
}

时间复杂度 O ( n ∗ m ) O(n*m) O(nm)
空间复杂度 O ( n ∗ m ) O(n*m) O(nm)



Topic5不相交的线

题目:
在这里插入图片描述
在这里插入图片描述

思路:

接下来进行动规五步曲:
1.确定dp数组以及下标的含义:
dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]
2.确定递推公式:
主要就是两大情况:1.text1[i - 1] 与 text2[j - 1]相同 2.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] = max(dp[i - 1][j], dp[i][j - 1]);
3.dp数组如何初始化

 for(int i=0;i<=nums1.length;i++) dp[i][0]=0;for(int i=0;i<=nums2.length;i++) dp[0][i]=0;

4.确定遍历顺序
外层for循环遍历A,内层for循环遍历B。
5.举例推导dp数组

class Solution {public int maxUncrossedLines(int[] nums1, int[] nums2) {int len1 = nums1.length;int len2 = nums2.length;int[][] dp = new int[len1 + 1][len2 + 1];for (int i = 0; i <= len1; i++)dp[i][0] = 0;for (int i = 0; i <= len2; i++)dp[0][i] = 0;int result = 0;for (int i = 1; i < len1 + 1; i++) {for (int j = 1; j < len2 + 1; j++) {if (nums1[i - 1] == nums2[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);result = Math.max(result, dp[i][j]);}}return result;}
}

时间复杂度 O ( n ∗ m ) O(n*m) O(nm)
空间复杂度 O ( n ∗ m ) O(n*m) O(nm)



Topic6最大子序和动态规划

题目:
在这里插入图片描述

思路:

接下来进行动规五步曲:
1.确定dp数组以及下标的含义:
dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]
2.确定递推公式:
dp[i]只有两个方向可以推出来:
dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
nums[i],即:从头开始计算当前连续子序列和
一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);
3.dp数组如何初始化
dp[0] = nums[0]
4.确定遍历顺序
递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历。
5.举例推导dp数组
以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下:
在这里插入图片描述

class Solution {public int maxSubArray(int[] nums) {int len = nums.length;int[] dp = new int[len];Arrays.fill(dp, Integer.MIN_VALUE);int tem;dp[0] = nums[0];if (len == 0)return 0;int result = nums[0];for (int i = 1; i < len; i++) {dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);result = Math.max(result, dp[i]);}return result;}
}

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( n ) O(n) O(n)

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

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

相关文章

mac基础操作、快捷、软件快捷方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 mac基础操作、快捷、软件快捷方式 前言mac快捷操作快捷查找切换页面页面缩略访达和命令端切换创建文件夹创建文件删除文件/文件夹获取文件的路径移动文件或文件夹复制文件命令端常用命令 前言 主要是方…

B端:请说出你的设计依据,咋办?来吧,尼尔森法则告诉他。

在B端界面设计中&#xff0c;客户经常会问这样设计的依据是什么&#xff0c;许多设计师回答不上来&#xff0c;或者是答非所问&#xff0c;流于表面&#xff0c;这是时候就需要请出来尼尔森用户体验设计的十大法则&#xff0c;那么问题来了&#xff0c;如何让这10大法则和界面相…

Python学习笔记23 - 目录操作

os模块操作目录相关函数 os.path模块操作目录相关函数 案例1 —— 列出指定目录下的所有.py文件 案例2 —— walk()

论文笔记:NEFTune: Noisy Embeddings Improve Instruction Finetuning

iclr 2024 reviewer 评分 5666 1 论文思路 论文的原理很简单&#xff1a;在finetune过程的词向量中引入一些均匀分布的噪声即可明显地提升模型的表现 2 方法评估

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

c++中常用库函数

大小写转换 islower/isupper函数 char ch1 A; char ch2 b;//使用islower函数判断字符是否为小写字母 if(islower(ch1)){cout << ch1 << "is a lowercase letter." << end1; } else{cout << ch1 << "is not a lowercase lette…

图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维 1.1 缩放矩阵 x&#xff0c;y分别表示在x轴&#xff0c;y轴缩放的倍数 示例&#xff1a; 点(2,1)在x&#xff0c;y轴上分别缩放x倍&#xff0c;y倍 1.2 平移矩阵 x&#xff0c;y分表表示在x轴&#xff0c;y轴上移动的距离 示例&#xff1a;点&#xff08;2,1&#xf…

AI天使汇联合150家顶级基金、战投,征集优秀AI创业项目

鉴于AI天使汇主办的2024年3月期优秀项目征集活动效果超出预期&#xff0c;3月活动最后TOP20路演者中已有多家快速拿到了TS。 路演活动质量受到了AI创业公司和基金/战投伙伴的高度评价&#xff0c;现在开始四月期活动报名! 本期征集活动联合的顶级基金和战投数量增加到了150家…

LabVIEW无线快速存取记录器(WQAR)测试平台

LabVIEW无线快速存取记录器&#xff08;WQAR&#xff09;测试平台 随着民用航空业的迅速发展&#xff0c;航空安全的保障日益成为公众和专业领域的关注焦点。无线快速存取记录器&#xff08;WirelessQuick Access Recorder, WQAR&#xff09;作为记录飞行数据、监控飞行品质的…

使用这几款插件,GitHub阅读代码效率噌噌噌

** octotree&#xff1a;生成仓库目录 ** 这可能是我用得最多的一款插件了&#xff0c;大家有没有遇到过这种情况。每次点击一个文件后&#xff0c;整个文件列表就会被隐藏&#xff0c;想查看其它文件只能回退后再次进入。别提有多蛋疼了…… 而这款插件就完美解决了这个问题…

Day101:漏洞发现-漏扫项目篇NucleiYakitGobyAfrogXrayAwvs联动中转被动

目录 特征类-三方Poc调用&模版Poc调用 案例1&#xff1a;单点对某特征点进行安全评估 Goby-综合类 Nuclei-较综合类 Afrog-特征类 Yakit-可特征可综合 案例2&#xff1a;新型对某特征点进行安全评估 综合类-主动漏扫&中转联动&被动联动 案例1&#xff1a;…

【学习笔记十四】EWM发货流程概述及相关配置

一、EWM发货流程与ERP集成配置 1.将凭证类型从 ERP 系统映射至 EWM ERP交货单凭证类型LF映射到EWM凭证类型OUTB 2.从 ERP 系统映射项目类型至 EWM ERP交货单凭证类型+ERP交货单项目类型TAN映射到EWM项目类型是ODLV 3.定义出库交货的参数文件 ①定义外向交货处理的凭证类型OUT…

Linux查看进程

Linux查看进程 引言查看进程1.快速查看运行中的进程列表2. 查看所有用户的所有进程3.显示所有进程的完整格式。4.动态显示进程的信息5.根据进程名查找进程ID6.以树状图的方式显示进程间的父子关系7.查找指定名字的进程id 引言 Linux查看进程在日常的使用中比较常见&#xff0c…

gcn代码处理出现的问题

README 版本不一致 python 2.7 PYTHON 3.7 切换 TensorFlow系统的学习使用 数据集下载

c++ - 类的默认成员函数

文章目录 前言一、构造函数二、析构函数三、拷贝构造函数四、重载赋值操作符五、取地址及const取地址操作符重载 前言 默认成员函数是编译器自动生成的&#xff0c;也可以自己重写&#xff0c;自己重写之后编译器就不再生成&#xff0c;下面是深入了解这些成员函数。 一、构造…

执行npm命令一直出现sill idealTree buildDeps怎么办?

一、问题 今天在运行npm时候一直出项sill idealTree buildDeps问题 二、 解决 1、网上查了一下&#xff0c;有网友说先删除用户界面下的npmrc文件&#xff08;注意一定是用户C:\Users\{账户}\下的.npmrc文件下不是nodejs里面&#xff09;&#xff0c;进入到对应目录下&#x…

3dmax制作小熊猫的基本流程

1.透视图插入面片&#xff0c;改高度宽度&#xff0c;把参考图放进面片里。 2.角度捕捉切换&#xff0c;角度改为90 3.shift旋转&#xff0c;旋转面片&#xff0c;复制一个出来 4.在前视图&#xff0c;把参考图片中的正式图小熊猫的一半的位置&#xff08;可以是眼睛&#x…

自己操作逆向案例一——某竞赛网登录密码加密,超级简单,泪目了!

网址&#xff1a;aHR0cHM6Ly9leGFtem9uZS5zYWlrci5jb20vcXVlc3Rpb24vZXhwbG9yZQ 打开开发者工具&#xff0c;点击账号密码登录&#xff0c;进行抓包 先进行搜索&#xff0c;发现一下子就找到了&#xff0c;且看上去很像MD5加密&#xff0c;打上断点&#xff0c;再次点击登录。…

如何保证消息不丢失?——使用rabbitmq的死信队列!

如何保证消息不丢失?——使用rabbitmq的死信队列&#xff01; 1、什么是死信 在 RabbitMQ 中充当主角的就是消息&#xff0c;在不同场景下&#xff0c;消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式&#xff0c;这些场景包括&#xff1a; 消息被拒绝访问&am…