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

news2024/11/30 8:53:38

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.coloradmin.cn/o/1348285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 安装 mysql【使用yum源进行安装】

配置yum 源 首先&#xff0c;去到mysql网站&#xff0c;找到它的rpm的资源包 “mysql80-community-release-el9-5.noarch.rpm” 我们将其下载下来&#xff0c;然后配置yum源&#xff08;下面两种方式二选一即可&#xff09; ① 使用xftp传输&#xff0c;然后配置yum源 rpm …

【数据结构】栈和队列(队列的基本操作和基础知识)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​ 目录 前言 队列 队列的概念和结构 队列的…

王道考研计算机网络——应用层

如何为用户提供服务&#xff1f; CS/P2P 提高域名解析的速度&#xff1a;local name server高速缓存&#xff1a;直接地址映射/低级的域名服务器的地址 本机也有告诉缓存&#xff1a;本机开机的时候从本地域名服务器当中下载域名和地址的对应数据库&#xff0c;放到本地的高…

FDM3D打印系列——RX-78-2高达胸像打印

https://v.youku.com/v_show/id_XNjI4OTQ2NjkyNA.html   大家好&#xff0c;我是阿赵。   2024年的第一篇博客&#xff0c;做一个3D打印作品&#xff0c;RX-78-2高达胸像打印。 成年男人是很少收得到礼物的&#xff0c;所以礼物都要自己准备。这个模型&#xff0c;就算是我…

Javaweb之Mybatis入门程序的详细解析

1.2 入门程序实现 1.2.1 准备工作 1.2.1.1 创建springboot工程 创建springboot工程&#xff0c;并导入 mybatis的起步依赖、mysql的驱动包。 项目工程创建完成后&#xff0c;自动在pom.xml文件中&#xff0c;导入Mybatis依赖和MySQL驱动依赖 <!-- 仅供参考&#xff1a;只…

数据库——建立ER模型及关系模型转换

​ 【实验内容及要求】 使用画图工具或MySQL Workbench等建模工具设计出相应的ER图&#xff0c;将局部ER图合并为一个整体ER模型&#xff0c;在ER模型中填加多样性约束&#xff0c;建立显示主键的ER模型&#xff0c;标识实体的属性&#xff0c;确认主键、外键。将上述ER图转化…

基于 LightGBM 的系统访问风险识别

基于 LightGBM 的系统访问风险识别 文章目录 基于 LightGBM 的系统访问风险识别一、课题来源二、任务描述三、课题背景四、数据获取分析及说明&#xff08;1&#xff09;登录https://www.datafountain.cn并获取相关数据&#xff08;2&#xff09;数据集文件说明&#xff08;3&a…

pycharm python环境安装

目录 1.Python安装 2.PyQt5介绍 3.安装pyuic 4.启动designer.exe 5.pyinstaller(打包发布程序) 6.指定源安装 7.PyQt5-tools安装失败处理 8.控件介绍 9.错误记录 1.NameError: name reload is not defined 10.开发记录 重写报文输出和文件 ​编辑 1.Python安装 点…

linux用户态与内核态通过字符设备交互

linux用户态与内核态通过字符设备交互 简述 Linux设备分为三类&#xff0c;字符设备、块设备、网络接口设备。字符设备只能一个字节一个字节读取&#xff0c;常见外设基本都是字符设备。块设备一般用于存储设备&#xff0c;一块一块的读取。网络设备&#xff0c;Linux将对网络…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…

2024的十大技术趋势预测

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 2024年&#xff0c;科技圈还会有什么样的新鲜新发生&#xff1f;techradar的记者Lance Ulanoff预测了科技圈的2024十大趋势&#xff0c;包括AI、…

flutter学习-day20-使用SafeArea组件处理各机型的安全距离

文章目录 1. 介绍2. 解析3. 示例和效果图4. 特殊情况 1. 介绍 安全区域&#xff0c;指的是移动端设备的可视窗口范围。处于安全区域的内容不受圆角、刘海屏、iPhone 小黑条、状态栏等的影响&#xff0c;也就是说&#xff0c;我们要做好适配&#xff0c;必须保证页面可视、可操…

FA组件详解

1、了解FA核心组件以及功能 &#xff08;1&#xff09;TC&#xff08;Thin Client&#xff1a;瘦终端&#xff09;&#xff1a;就是类似于机顶盒的一个小盒子&#xff0c;里面有CPU、内存、USB、MIC、HDMI等接口&#xff0c;可以理解为小型电脑&#xff0c;但是它里面是没有操作…

硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件扩展 (SHE)的区别

术语 硬件安全模块 (HSM) &#xff1a;Hardware Security Modules硬件安全引擎 (HSE) &#xff1a;Hardware Security Engines安全硬件扩展 (SHE) &#xff1a; Secure Hardware Extensions 介绍 在汽车行业中&#xff0c;硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件…

【ESP-NOW with ESP32:从多个开发板接收数据(多对一)】

【ESP-NOW with ESP32&#xff1a;从多个开发板接收数据&#xff08;多对一&#xff09;】 1. 项目概况2. 先决条件2.1 环境配置2.2 所需零件 3. 获取接收板 MAC 地址4. ESP32 发送码 &#xff08;ESP-NOW&#xff09;4.1 代码的工作原理4.2 setup&#xff08;&#xff09;4.3 …

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日&#xff0c;新年的第一缕阳光已经普照大地&#xff0c;祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒&#xff0c;事业有成。 今天也是我加入CSDN的第4100天&#xff0c;但回过头看一看&#xff0c;这么长的时间也没有在CSDN写下几篇…

Windows 10 安装和开启VNCServer 服务

Windows 10 安装和开启VNCServer 服务 登录云服务器 使用本地RDP登录到配置VNCServer服务的Windows10系统的云服务器。 下载VNC Server安装包 打开官网下载VNCServer安装包 URL&#xff1a;https://www.realvnc.com/en/connect/download/vnc/windows/ 安装VNC Server 双击…

LVGL 在framebuffer设备上的移植

LVGL 在framebuffer设备上的移植 ItemDescDate2023-12-31Authorhongxi.zhuplatformNXP I.MX6ULLLCDSPI TFTLCD NV3030B 文章目录 LVGL 在framebuffer设备上的移植一、LVGL源码获取二、源码修改适配三、编译&运行补充 一、LVGL源码获取 新建lvgl_imx6ull文件夹&#xff0c…

【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],…

MySQL高级SQL语句补充

目录 1.空值&#xff08;NULL&#xff09;和 无值&#xff08; &#xff09;的区别 2.正则表达式 3.存储过程 存储过程的优点 创建存储过程 调用存储过程 查看存储过程 存储过程的参数 IN 输入参数 OUT 输出参数 INOUT 输入输出参数 删除存储过程 存储过程的控制语…