Day53|动态规划part14: 1143.最长公共子序列、1035. 不相交的线、53. 最大子序和

1143. 最长公共子序列

这题有点像递增子序列和公共子数组的组合, 要求公共子序列不一定非要是连续的。

  1. 确定dp数组下标及其含义

dp[i][j]表示text1[i - 1]与text2[j - 1]结尾的最高公共子序列。

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

最后返回的结果是**dp[text1.length()][text2.length()],**因为这里不相等并不是推倒重新再来,因此遍历到最后一定是最大的。

  1. 确定递推公式

text1[i - 1]和text2[j - 1]相等和不相等。

相等:dp[i][j] = dp[i - 1][j - 1] + 1

不相等:dp[i][j] = max(dp[i-1][j],dp[i][j-1])(相当于对两个字符串错开进行对齐)

  1. 初始化

全为0即可;

  1. 遍历顺序

从前往后。

  1. 举例推导dp数组

image

最终代码:

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

1035. 不相交的线(和1143代码一摸一样)

本题的关键在于转化,实际上和1143找最长子序列是一样的代码。(我怎么看不出来!!!)

还真是一样的代码,修改完直接AC:

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

怎么样才能画出不相交的线:让相同的数按照相同的相对顺序出现 ,实际上也就是求最长公共子序列。

  1. 最大子序和(动态规划解法)

之前贪心就做过了,这里贴一下贪心解法:

class Solution {public int maxSubArray(int[] nums) {//贪心:先累加,当前和为负数时放弃,统计最大。int sum = 0;int maxSum = Integer.MIN_VALUE;for(int i = 0; i < nums.length; i++){if(sum < 0){sum = 0;}sum += nums[i];maxSum = maxSum = Integer.max(sum , maxSum);}return maxSum;}}

动态规划

  1. 确定dp数组下标及其含义

dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]

  1. 确定递推公式

dp[i]只有两个方向可以推出来:

dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和

nums[i],即:从头开始计算当前连续子序列和

一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);

  1. 初始化

dp[0] = nums[0]

  1. 遍历顺序

从前到后,用res记录最大值

  1. 举例推导dp数组

image

最终代码:

class Solution {public int maxSubArray(int[] nums) {int dp[] = new int[nums.length];dp[0] = nums[0];int result = nums[0];//dp[i]表示包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]for (int i = 1; i < nums.length; i++) {dp[i] = Math.max(nums[i] + dp[i - 1], nums[i]);result = Math.max(result, dp[i]);}return result;}
}

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

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

相关文章

C++入门基础(一)

目录 C关键字命名空间命名冲突例子域的概念理解命名空间定义例子1例子2例子3例子4例子5例子6例子7 C输出与输入输出输入 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x…

Web前端开发之CSS_1

CSS选择器字体属性背景属性文本属性表格属性 1. CSS 1.1 CSS简介 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表。CSS文件后缀名为 .css 。CSS用于HTML文档中元素样式的定义。使用CSS可以让网页具有美观一致…

18 JavaScript学习:错误

JavaScript错误 JavaScript错误通常指的是在编写JavaScript代码时发生的错误。这些错误可能是语法错误、运行时错误或逻辑错误。以下是对这些错误的一些常见分类和解释&#xff1a; 语法错误&#xff1a; 这类错误发生在代码编写阶段&#xff0c;通常是由于代码不符合JavaScrip…

python学习笔记----python基础语法(二)

一、字面量 在 Python 中&#xff0c;字面量 是一种直接在代码中表示其自身值的数据。字面量用于创建值&#xff0c;并且可以直接被 Python 的解释器识别和处理。不同类型的数据有不同的字面量形式。下面是一些常见的字面量类型&#xff1a; 二、注释 注释&#xff1a;在程序…

LeetCode in Python 74/240. Search a 2D Matrix I/II (搜索二维矩阵I/II)

搜索二维矩阵I其实可以转换为搜索一维数组&#xff0c;原因在于&#xff0c;只要先确定搜索的整数应该在哪一行&#xff0c;即可对该行进行二分查找。 搜索二维矩阵II中矩阵元素排列方式与I不同&#xff0c;但思想大致相同。 目录 LeetCode in Python 74. LeetCode in Pyth…

基于java+springboot+vue实现的医疗挂号管理系统(文末源码+Lw)203

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对医疗挂号信息管理的提升&#x…

如何增强交友、婚恋平台、金融等平台的安全性

运营商二要素核验是一种数字身份验证方法&#xff0c;主要使用用户的手机号码和姓名作为核验要素。这两个要素被认为是最基本的用户身份信息&#xff0c;通过运营商的数据库来核实其真实性。 在实际操作中&#xff0c;用户需要提供手机号码和姓名进行验证。应用系统会调用接口…

绘唐3AIGCMJ提示词推导指令

绘唐3AIGCMJ提示词推导指令Docshttps://qvfbz6lhqnd.feishu.cn/wiki/D3YLwmIzmivZ7BkDij6coVcbn7W # Role: 小说导演 ## Profile *Author*: X *Version*: 1.0 *Language*: 中文 *Description*: 这个角色会对用户输入的小说文本内容进行分析&#xff0c;然后用适用于midjourne…

Facebook的未知力量:数字世界的新引擎

在数字化的时代&#xff0c;社交媒体已经成为了我们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;其影响力远远超出了我们的想象。但是&#xff0c;Facebook背后隐藏的力量和影响远不止于此&#xff0c;它正逐渐成为数字世界的新引擎&#xff0…

python-pytorch官方示例Generating Names with a Character-Level RNN的部分理解0.5.03

pytorch官方示例Generating Names with a Character-Level RNN的部分理解 模型结构功能关键技术模型输入模型输出预测实现 模型结构 功能 输入一个类别名和一个英文字符&#xff0c;就可以自动生成这个类别&#xff0c;且以英文字符开始的姓名 关键技术 将字符进行one-hot编…

Kafka 3.x.x 入门到精通(06)——Kafka进阶

Kafka 3.x.x 入门到精通&#xff08;06&#xff09;&#x1f449;&#x1f449;&#x1f449;&#x1f449; Kafka进阶 3. Kafka进阶3.1 Controller选举3.2 Broker上线下线3.3 数据偏移量定位3.4 Topic删除3.5 日志清理和压缩3.7 页缓存3.8 零拷贝3.9 顺写日志3.10 Linux集群部…

Linux驱动开发——(四)内核定时器

目录 一、内核的时间管理 1.1 节拍率 1.2 全局变量jiffies 1.3 绕回 二、内核定时器 2.1 简介 2.2 定时器API函数 2.2.1 init_timer函数 2.2.2 add_timer函数 2.2.3 del_timer函数 2.2.4 del_timer_sync函数 2.2.5 mod_timer函数 2.3 Linux内核短延时函数 三、驱…