D45D46|动态规划之子序列问题

300.最长递增子序列:

初始思路:

动态规划五部曲:

1)dp数组的定义,dp[i]表述数组第i个元素大于前面几个值;

2)dp数组的迭代,min = nums[x]表示递增数组中的最后一个值,如果nums[i]>min;nums[i]=nums[i-1]+1;else nums[i] = nums[i-1]

3)初始化 dp[0] = 1

4)顺序:前序;

5)遍历:有点不对,5和3那里有点不对劲,先试试。

class Solution {public int lengthOfLIS(int[] nums) {int[] dp = new int[nums.length];dp[0]=1;int minvalue = nums[0];for(int i = 1;i<nums.length;i++){if(nums[i]>minvalue){dp[i] = dp[i-1]+1;minvalue = nums[i];}else{dp[i] = dp[i-1];minvalue = nums[i];}}return dp[nums.length-1];}
}

无法正确通过,所以题解不正确。

题解复盘:

动态规划五部曲 :

1)dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度

2)if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);

3)每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1.

4)从前向后遍历

5)

这道题看实例推导要比看文字更简单些,一个循环遍历数组中所有元素,一个循环遍历数组中在i之前的元素, dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度,

就上面的例子比较好理解当i遍历到3时,j会从0开始遍历到2;3>0 dp[3]=dp[0]+1=2;3>1 dp[3] = dp[1]+1 = 3,3>0,dp[3] = max(dp[3],dp[2]+1) = 3;

result记录遍历中的最大值


674.最长连续递增序列

初始思路:

这道题相对于上一道题新增了连续的条件,感觉反而简单了,如果当前元素大于前一元素,dp[i]++,如果小于的话dp[i]归一.

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

题解复盘:

关键在于递推公式的变化 :

  1. 确定递推公式

如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1 。

即:dp[i] = dp[i - 1] + 1;

注意这里就体现出和动态规划:300.最长递增子序列 (opens new window)的区别!

因为本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)

既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i] 和 nums[i - 1]。

这里大家要好好体会一下!


718.最长重复子数组 

初始思路&&题解复盘:

感觉对照示例会更容易理解这部分的解题思路:

1)确定dp数组及其下标的含义:dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 

2)递推公式:即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;

此处注意A[i - 1] 和B[j - 1]相等即推导dp[i][j]

3)初始化:为0即可

4)遍历顺序:一层循环遍历一个数组

5)举例:如下。

class Solution {public int findLength(int[] nums1, int[] nums2) {int[][] dp = new int[nums1.length+1][nums2.length+1];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;}
}

1143.最长公共子序列

 初始思路:

相对于上面一道题,两个字符串的长度不太一样了,而且数字也不是连续的。所以循环顺序一定要有所调整。

class Solution {public int longestCommonSubsequence(String text1, String text2) {int result = 0;char[] t1 = text1.toCharArray();char[] t2 = text2.toCharArray();int[][] dp = new int[t1.length+1][t2.length+1];for(int i = 1;i<t1.length+1;i++){for(int j = 1;j<t2.length+1;j++){if(t1[i-1]==t2[j-1]){//System.out.println(t1[i-1]);dp[i][j] = dp[i-1][j-1]+1;//System.out.println(dp[i][j]);}else{dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);}result = Math.max(result,dp[i][j]);}}return result;}
}

 以上是标答:

我的答案无法全部AC的递归逻辑是

                if(t1[i-1]==t2[j-1]){//System.out.println(t1[i-1]);dp[i][j] =  Math.max(dp[i-1][j],dp[i][j-1])+1;//System.out.println(dp[i][j]);}else{dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);}

区别在哪呢?

 

不分析我的错误逻辑了,

可以看到如果text1和text2中的c相等,此时结果就等于ab串和a串中重复的最大子数组和+1;

如果text1和text2中的b和c不等,此时结果就是a串和ac串或ab串和a串中重复的最大子数组和。 


1035.不相交的线

初始思路:

同上一题相同,按照顺序但不连续的重复子数组

718是一定是要连续的重复子数组。


53.最大子数组和

初始思路:

如何转换成dp问题?

确定递推公式

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

  • dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
  • nums[i],即:从头开始计算当前连续子序列和

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

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

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

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

相关文章

【python_数据分组】

对excel按照标签进行分组&#xff0c;例如按照“开票主体和对方公司”进行分组&#xff0c;并获取对应的明细。 表格如下&#xff1a; def main(excel_data):result {}for d in excel_data:if str(d[0])str(d[1]) in result:result[str(d[0])str(d[1])].append([d[0],d[1],…

table表格中使用el-popover 无效问题解决

实例只针对单个的按钮管用在表格里每一列都有el-popover相当于是v-for遍历了 所以我们在触发按钮的时候并不是单个的触发某一个 主要执行 代码 <el-popover placement"left" :ref"popover-${scope.$index}"> 动态绑定了ref 关闭弹窗 执行deltask…

留言板(Mybatis连接数据库版)

目录 1.添加Mybatis和SQL的依赖 2.建立数据库和需要的表 3.对应表中的字段&#xff0c;补充Java对象 4.对代码进行逻辑分层 5.后端逻辑代码 之前的项目实例【基于Spring MVC的前后端交互案例及应用分层的实现】https://blog.csdn.net/weixin_67793092/article/details/134…

在FC中手工创建虚拟机模板

1、Linux去除个性化信息 &#xff08;1&#xff09;编辑网卡配置文件&#xff0c;只保留以下内容&#xff08;以RHEL 7为例&#xff09; &#xff08;2&#xff09;清除主机密钥信息&#xff08;开机会自动生成&#xff09; &#xff08;3&#xff09;清除Machine ID&#xff…

【HarmonyOS开发】探究Hap与App包的结构与区别

1、Hap与App包的区别 OpenHarmony 可以进行两种形式&#xff08;Hap和App&#xff09;的打包&#xff0c;HAP是用于本地调试的&#xff0c;APP包是用于上架发布的。 根据不同的设备类型&#xff0c;一个APP包可以包含多个HAP包。 下面从两个角度进行分析 1.1 编译构建角度 编…

ThinkPad产品如何升级BIOS程序

操作步骤: 重要提示&#xff1a; 更新BIOS存在风险&#xff01;如果您的电脑在此过程中出现死机&#xff0c;系统崩溃或断电&#xff0c;则BIOS或UEFI固件程序可能会损坏&#xff0c;这将使您的电脑无法启动。 由于BIOS的版本或者在升级过程中出错&#xff0c;可能会造成不可…

Flink学习-时间和窗口

在流数据处理应用中&#xff0c;一个很重要、也很常见的操作就是窗口计算。所谓的“窗口”&#xff0c;一 般就是划定的一段时间范围&#xff0c;也就是“时间窗”&#xff1b;对在这范围内的数据进行处理&#xff0c;就是所谓的 窗口计算。所以窗口和时间往往是分不开的。 时…

HTML5+CSS3③——无语义布局标签、画盒子、CSS定义、CSS引入方式

目录 无语义布局标签 画盒子 CSS定义 小结 CSS引入方式 小结 无语义布局标签 画盒子 CSS定义 小结 CSS引入方式 小结

【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一、概述 MyBatis简介 主要特性 1. 动态SQL 2.结果映射 3 .插件机制 二、MyBatis配置文件 1.配置文件结构 数据库连…

Vue.js和Node.js的关系--类比Java系列

首先我们看一张图 这里我们类比了Java的jvm和JavaScript的node.js。 可以看到&#xff0c;node.js是基础&#xff0c;提供了基础的编译执行的能力。vue,js是实际上定义了一种他自己的代码格式&#xff0c;以加速开发。

详解全志R128 RTOS安全方案功能

介绍 R128 下安全方案的功能。安全完整的方案基于标准方案扩展&#xff0c;覆盖硬件安全、硬件加解密引擎、安全启动、安全系统、安全存储等方面。 配置文件相关 本文涉及到一些配置文件&#xff0c;在此进行说明。 env*.cfg配置文件路径&#xff1a; board/<chip>/&…

ROS学习记录:用C++实现对wpr_simulation软件包中机器人的运动控制

一、在工作空间下输入catkin_make进行编译 二、在工作空间中输入source ./devel/setup.bash后回车 三、机器人的运动控制在wpr_simulation中有一个例子程序&#xff0c;在工作空间中输入&#xff1a; roslaunch wpr_simulation wpb_simple.launch后回车 四、就会启动一个仿真环…