算法打卡:第九章 动态规划part11

news/2024/11/14 11:55:11/

今日收获:最长公共子序列,不相交的线,最大子序和,判断子序列

1. 最长公共子序列

题目链接:1143. 最长公共子序列 - 力扣(LeetCode)

思路:

(1)dp[i][j]表示两个字符串中下标为 i-1 和 j-1 的字符之前相等的字符个数。

(2)初始化:第一行和第一列均初始化为0

(3)遍历顺序:从上到下从左到右遍历

(4)递推公式:如果两个字符相等,则dp[i][j]等于两个字符串前一个字符的dp值加1。两个字符不相等,则当前位置等于两个字符串分别前移一位的最大值。

方法:

java">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=1;i<=len1;i++){for (int j=1;j<=len2;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[len1][len2];}
}

2. 不相交的线

题目链接:1035. 不相交的线 - 力扣(LeetCode)

思路:和上一道题思路相同。

方法:

java">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=1;i<=len1;i++){for (int j=1;j<=len2;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[len1][len2];}
}

3. 最大子序和

题目链接:53. 最大子数组和 - 力扣(LeetCode)

思路:

(1)dp数组表示下标为 i 及之前数组的连续最大和

(2)初始化dp数组的第一个元素为数组的一个元素

(3)遍历顺序:从数组的第二个数组开始,从左到右遍历

(4)递推公式:当前dp数组的值等于前一个位置的值加上当前元素的值和当前元素的值取最大值。(如果之前元素的值加上当前元素值小于当前元素本身,不如从当前元素开始累加)

方法:

java">class Solution {public int maxSubArray(int[] nums) {int len=nums.length;int[] dp=new int[len];dp[0]=nums[0];int max=dp[0];  // 最后一位不一定是最大子数组和for (int i=1;i<len;i++){dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);max=Math.max(max,dp[i]);}return max;}
}

4. 判断子序列

题目链接:392. 判断子序列 - 力扣(LeetCode)

思路:和最长公共子序列思路类似。最后再判断

(1)dp[i][j]表示两个字符串中下标为 i-1 和 j-1 的字符之前相等的字符个数。

(2)初始化:第一行和第一列均初始化为0

(3)遍历顺序:从上到下从左到右遍历

(4)递推公式:如果两个字符相等,则dp[i][j]等于两个字符串前一个字符的dp值加1。两个字符不相等,则当前位置等于长字符串前移一位的值。

方法:

java">class Solution {public boolean isSubsequence(String s, String t) {int len1=s.length();int len2=t.length();int[][] dp=new int[len1+1][len2+1];for (int i=1;i<=len1;i++){for (int j=1;j<=len2;j++){if (s.charAt(i-1)==t.charAt(j-1)){dp[i][j]=dp[i-1][j-1]+1;}else {dp[i][j]=dp[i][j-1];}}}return dp[len1][len2]==len1;}
}

五. 总结

        动态规划每选一步都和最终的结果有关。根据题目要求的值可以推断出dp数组的定义,通常就是每一小步代表的题目所求值。 


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

相关文章

十,Spring Boot 的内容协商的详细剖析(附+Debug调试说明)

十&#xff0c;Spring Boot 的内容协商的详细剖析(附Debug调试说明) 文章目录 十&#xff0c;Spring Boot 的内容协商的详细剖析(附Debug调试说明)1. 基本介绍2. 准备工作3. 内容协商的本质4. 内容协商&#xff1a;注意事项和使用细节5. 总结&#xff1a;6. 最后&#xff1a; 1…

微信小程序中的模块化、组件化开发:完整指南

文章目录 前言一、模块化与组件化开发的优势1.1模块化开发的优势1.2 组件化开发的优势 二、组件的抽离标准及规范2.1 抽离组件的标准2.2 组件化开发规范 三、模块化规范的种类及优劣比较3.1 CommonJS3.2 ES6 Modules3.3 优劣对比 四、组件封装&#xff1a;全局组件、分包组件、…

PCIe扫盲(六)

系列文章目录 PCIe扫盲&#xff08;一&#xff09; PCIe扫盲&#xff08;二&#xff09; PCIe扫盲&#xff08;三&#xff09; PCIe扫盲&#xff08;四&#xff09; PCIe扫盲&#xff08;五&#xff09; PCIe扫盲&#xff08;六&#xff09; 文章目录 系列文章目录Flow Control…

【PHP】使用thinkphp5查询最大值时,把varchar类型字段转换成数字

有时候我们需要把carchar类型的字段进行聚合函数运运行&#xff08;max、min、avg&#xff09;&#xff0c;但是如果直接用聚合函数&#xff0c;得到的结果是错误的&#xff0c;因为varchar字段是字符串&#xff0c;无法直接使用聚合函数&#xff0c;所以需要把varchar字段转换…

apach httpd多后缀解析漏洞

漏洞详情&#xff1a; httpd支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。 那么&#xff0c;在有多个后缀的情况下&#xff0c;只要一个文件含有.php后缀的文件即将被识别成PHP文件&#xff0c;没必要是最后一个后缀。 利用这个特性&#xff0c;可以绕过…

[Linux]从零开始的泰山派系统安装与远程教程

一、前言 泰山派买回来也有一阵子了&#xff0c;最近慢慢开始研究。当然&#xff0c;学习这种Linux的开发板的第一步就是安装系统&#xff0c;对于RK系列的芯片系统安装有专门的软件&#xff0c;所有在系统安装方面比较简单。更多的还是我们应该怎么去编译系统&#xff0c;这一…

激光粉尘传感器:筑牢粮仓安全防线,有效应对粮食粉尘爆炸高危风险

随着我国农业的持续发展和粮食产量的稳步提升&#xff0c;2023年全国粮食总产量达到了13908.2亿斤&#xff0c;这一丰硕成果不仅保障了国家的粮食安全&#xff0c;也对粮食的储备、加工、运输等环节提出了更高的要求。然而&#xff0c;在粮食产业链的各个环节中&#xff0c;粮食…

[模板]树的最长路径

[模板]树的最长路径 题目描述 给定一棵树&#xff0c;树中包含 n 个结点&#xff08;编号1~n&#xff09;和 n-1 条无向边&#xff0c;每条边都有一个权值。 现在请你找到树中的一条最长路径。 换句话说&#xff0c;要找到一条路径&#xff0c;使得使得路径两端的点的距离最远…