当前位置: 首页 > news >正文

代码随想录算法训练营day53|第九章 动态规划part14

目录

1143.最长公共子序列 

1035.不相交的线 

53. 最大子序和 


1143.最长公共子序列 

体会一下本题和 718. 最长重复子数组 的区别  

视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili

代码随想录

首先这道题肯定是要用二维数组来做的,一维数组倒不清楚从哪里来的结果。dp[i][j]表示长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j],道理同样是便于在text字符串下标为0的时候依然符合递推公式。

主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同。

如果text1[i - 1] 与 text2[j - 1]相同,也就是找到了一个公共元素,故而也就要在原来的基础上加一,所谓原来的基础也就是左上角的dp[i-2][j-2],为什么要让指向两个字符串的指针同时往回退一个就储存着原来的基础呢,这是因为既然text1的(i - 1)处和text2的(j - 1)处所对应的元素相等,那就要往前倒,看[0, i - 2]和[0, j - 2]范围内的情况是怎样的,所以dp[i][j] = dp[i - 1][j - 1] + 1;

如果text1[i - 1] 与 text2[j - 1]不相同,既然不能使得长度加一了,那为了之后的推导也要为这个位置赋一个值,这个值必须表示长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列,那就看看周围的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])。(e.g. ace 和 acbde 两个字符串在遍历到 i = 2,j = 2的时候遇到了不相等的情况,就考虑ac和acb的情况、ace和ac的情况)

至于初始化,第一行列是和空字符串进行比较的,所以自然为0,而别的值也会被覆盖掉,所以都赋值成0更加省事。

遍历顺序只要知道从哪里得到的dp[i][j]即可,先初始化先推导要用到的值。

举例推导dp数组——

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

1035.不相交的线 

其实本题和 1143.最长公共子序列 是一模一样的,大家尝试自己做一做。

视频讲解:动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线_哔哩哔哩_bilibili

代码随想录

确实是和上面的题目是一毛一样的,稍微改改变量上面的代码就能AC。

53. 最大子序和 

这道题我们用贪心做过,这次 再用dp来做一遍 

视频讲解:看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和_哔哩哔哩_bilibili

代码随想录

感觉和上面的题真是没有一点关系。推导公式很容易懂:dp[i] = max(dp[i - 1] + nums[i], nums[i]),因为正向推导,所以必须初始化dp[0],因为最少包含一个元素,所以可以初始化为nums[0]本身。然后注意因为dp数组是要考虑全部的数在内的所以不一定是最大值,虽然确实是包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i],但真的最大和的子列不一定包含当前这个数,所以需要实时更新的,然后res也必须初始化为nums[0],防止nums只有一个元素的情况出现。

int maxSubArray(vector<int>& nums) {if (nums.size() == 0) return 0;vector<int> dp(nums.size());dp[0] = nums[0];int result = dp[0];for (int i = 1; i < nums.size(); i++) {dp[i] = max(dp[i - 1] + nums[i], nums[i]); // 状态转移公式if (dp[i] > result) result = dp[i]; // result 保存dp[i]的最大值}return result;}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关于springboot一个接口请求后,主动取消后,后端是否还在跑
  • SQLite3中的callback回调函数注意的细节
  • spring 技术100问?
  • python 导入excel空间三维坐标 生成三维曲面地形图 5-1、线条平滑曲面且可通过面观察柱体变化(一)
  • 华为OD机试 - 模拟数据序列化传输(Java JS Python C C++)
  • Python图像处理【22】基于卷积神经网络的图像去雾
  • js之继承
  • WebGL之灯光使用解析
  • 查询IP地址保障电商平台安全
  • [VulnHub靶机渗透] Nullbyte
  • Day16:HTTP协议、Spring MVC、Thymeleaf模版引擎、Spring处理浏览器请求实例(传入和传出)、MyBatis
  • Spring Boot中Excel数据导入导出的高效实现
  • Linux--基础命令
  • 在linux上部署yolov5和安装miniconda3
  • Nestjs与Vue实现多人聊天[简易版]
  • 【Leetcode】104. 二叉树的最大深度
  • 【个人向】《HTTP图解》阅后小结
  • 【刷算法】求1+2+3+...+n
  • JavaScript异步流程控制的前世今生
  • Java知识点总结(JavaIO-打印流)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PHP的类修饰符与访问修饰符
  • springboot_database项目介绍
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 技术:超级实用的电脑小技巧
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 赢得Docker挑战最佳实践
  • 源码安装memcached和php memcache扩展
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 浅谈sql中的in与not in,exists与not exists的区别
  • # Java NIO(一)FileChannel
  • ()、[]、{}、(())、[[]]命令替换
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)Android开发优化---------UI优化
  • (1)虚拟机的安装与使用,linux系统安装
  • (175)FPGA门控时钟技术
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (55)MOS管专题--->(10)MOS管的封装
  • (C语言)二分查找 超详细
  • (Java入门)抽象类,接口,内部类
  • (k8s中)docker netty OOM问题记录
  • (二)构建dubbo分布式平台-平台功能导图
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十八)三元表达式和列表解析
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原創) 未来三学期想要修的课 (日記)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)http协议