代码随想录算法训练营 动态规划part13

news/2024/7/24 7:36:34 标签: 动态规划, 算法

一、最长递增子序列 

300. 最长递增子序列 - 力扣(LeetCode)

前几天算法课上老师讲了

状态定义

dp[i] 的值代表 nums 以 nums[i] 结尾的最长子序列长度。
转移方程: 设 j∈[0,i),考虑每轮计算新 dp[i] 时,遍历 [0,i) 列表区间,做以下判断:

当 nums[i]>nums[j] 时: nums[i] 可以接在 nums[j] 之后(此题要求严格递增),此情况下最长上升子序列长度为 dp[j]+1 ;
当 nums[i]<=nums[j] 时: nums[i] 无法接在 nums[j] 之后,此情况上升子序列不成立,跳过。
上述所有 1. 情况 下计算出的 dp[j]+1 的最大值,为直到 i 的最长上升子序列长度(即 dp[i] )。实现方式为遍历 j 时,每轮执行 dp[i]=max(dp[i],dp[j]+1)。
转移方程: dp[i] = max(dp[i], dp[j] + 1) for j in [0, i)。
初始状态:

dp[i] 所有元素置 1,含义是每个元素都至少可以单独成为子序列,此时长度都为 1。
返回值:

返回 dp 列表最大值,即可得到全局最长上升子序列长度。

300. 最长递增子序列 - 力扣(LeetCode)

// Dynamic programming.
class Solution {
    public int lengthOfLIS(int[] nums) {
        if(nums.length == 0) return 0;
        int[] dp = new int[nums.length];
        int res = 0;
        Arrays.fill(dp, 1);
        for(int i = 0; i < nums.length; i++) {
            for(int j = 0; j < i; j++) {
                if(nums[j] < nums[i]) dp[i] = Math.max(dp[i], dp[j] + 1);
            }
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}

二、最长连续递增序列 

674. 最长连续递增序列 - 力扣(LeetCode)

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        if(nums.length <= 1)
            return nums.length;
        int ans = 1;
        int count = 1;
        for(int i=0;i<nums.length-1;i++) {
            if(nums[i+1] > nums[i]) {
                count++;
            } else {  
                count = 1;
            }
            ans = count > ans ? count : ans;
        }
        return ans;
    }
}

三、 最长重复子数组  

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        return nums1.length<=nums2.length? findMax(nums1,nums2):findMax(nums2,nums1);
    }

    public int findMax(int[] nums1, int[] nums2){
        int max=0;
        int m=nums1.length,n=nums2.length;
        /**
        nums1,nums2中较短的数组不动,这里默认nums1,较长的数组滑动
        初始位置:nums2右边界挨着nums1左边界,nums2从左往右滑动
         */
        // 第一阶段:nums2从左往右滑动,两数组重合部分长度不断增加,重合部分长度len从1开始增加
        // 重合部分:nums1起点下标0,nums2起点下标n-len,
        for(int len=1;len<=m;len++){
            max=Math.max(max,maxLen(nums1,0,nums2,n-len,len));
        }
        // 第二阶段:nums2从左往右滑动,两数组重合部分长度不变,重合部分长度始终为nums1长度m
        //  重合部分:nums1起点下标0,nums2起点下标n-m,然后递减
        for(int j=n-m;j>=0;j--){
            max=Math.max(max,maxLen(nums1,0,nums2,j,m));
        }
        // 第三阶段:nums2从左往右滑动,两数组重合部分长度递减,重合部分长度始终为nums1长度m-i
        //  重合部分:nums1起点下标i,递增,nums2起点下标0
        for(int i=1;i<m;i++){
            max=Math.max(max,maxLen(nums1,i,nums2,0,m-i));
        }
        return max;
    }

    /**
    nums1中下标i开始,nums2中下标j开始,长度为len子数组中,最长公共子数组(注意要连续)长度
     */
    public int maxLen(int[] nums1,int i,int[] nums2,int j,int len){
        int count=0,res=0;
        for(int k=0;k<len;k++){
            if(nums1[i+k]==nums2[j+k]){
                count++;
            }else if(count>0){
                //进入到这个if判断体里面,说明当前 nums1[i+k]!=nums2[j+k],即之前的公共子数组不再连续,
                // 所以要记录最大值,同时将count置零
                res=Math.max(count,res);
                count=0;
            }
        }
        /**
        1,count>0,说明有公共子数组是以nums1[i+len-1],nums2[j+len-1]结尾的,
           上面最后一步for循环没有进入到else if判断题里面,所以最终结果要取当前count和res的最大值
        2,count=0,说明res已经更新过了,res即为最终结果
         */
        return count>0? Math.max(count,res):res;
    }
}


http://www.niftyadmin.cn/n/5045261.html

相关文章

FFmpeg音视频分离器(二)

处理逻辑: 1.程序初始化&#xff1a;代码一开始初始化了所需的变量和数据结构&#xff0c;包括输入文件、输出文件的格式上下文以及其他参数。 2.输入文件打开和信息检索&#xff1a;程序尝试打开输入文件&#xff08;in_filename&#xff09;&#xff0c;并检索输入文件中的…

【Spring Cloud】 Gateway配置说明示例

Spring Cloud Gateway 是 Spring Cloud 中的一个项目&#xff0c;它用于构建微服务应用程序的 API 网关。Spring Cloud Gateway 建立在 Spring Boot 和 Spring WebFlux 之上&#xff0c;它提供了许多有用的功能&#xff0c;例如路由、断路器、限流、过滤器等。 在Spring Cloud…

Python经典练习题(二)

文章目录 &#x1f340;题目一&#x1f340;第二题&#x1f340;第三题&#x1f340;第四题&#x1f340;第五题 &#x1f340;题目一 古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&am…

Java 基于微信小程序的学生选课系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章&#xff1a; 简介第二章 技术栈第三章&#xff1a; 功能分析第四章 系统设计第五章 系统功…

【云原生】k8s新版本与Docker和Containerd的关联关系

目录 1.在安装k8s新版本时&#xff0c;没有检测到系统安装了 docker&#xff0c;k8s会用什么代替&#xff1f; 2.在安装过程中k8s如何跟docker关联的&#xff1f; 在较新版本的 Kubernetes 中&#xff0c;Docker 和 Containerd 之间的关系是相互独立的&#xff0c;而不是替代…

深度学习(一)读取数据 图片数据

若label作为文件夹名字&#xff0c;图片存放在里面&#xff1a; from torch.utils.data import Dataset import os import cv2 as cvclass MyData(Dataset):def __init__(self,root_dir,label_dir):self.root_dir root_dir #读取训练集的路径self.label_dir label_dir #读…

数据可视化 -- ECharts 入门

文章目录 引言1. ECharts的基本使用1.1 ECharts的快速上手1.2 相关配置讲解 2. ECharts常用图表2.1 图表1 柱状图2.1.1 柱状图的实现步骤2.1.2 柱状图的常见效果2.1.3 柱状图特点2.1.4 通用配置 2.2 图表2 折线图2.2.1 折线图的实现步骤2.2.2 折线图的常见效果2.2.3 折线图的特…

基于QT和UDP实现一个实时RTP数据包的接收,并将数据包转化成文件

简单介绍&#xff1a;代码写的比较详细&#xff0c;需要留意的地方看结尾介绍 头文件 #ifndef RTPRECEIVER_H #define RTPRECEIVER_H#include <QDialog> #include <QUdpSocket> #include <QFile> #include <QTextStream> #include <httpclient.h&g…