算法笔记|Day37动态规划X

算法笔记|Day37动态规划X

  • [☆☆☆☆☆leetcode 300.最长递增子序列](#☆☆☆☆☆leetcode 300.最长递增子序列)
  • [☆☆☆☆☆leetcode 674. 最长连续递增序列](#☆☆☆☆☆leetcode 674. 最长连续递增序列)
  • [☆☆☆☆☆leetcode 718. 最长重复子数组](#☆☆☆☆☆leetcode 718. 最长重复子数组)

☆☆☆☆☆leetcode 300.最长递增子序列

题目链接:leetcode 300.最长递增子序列

题目分析

1.dp数组含义:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度,取所有dp[i]中的最大值即为所求最长递增子序列的长度;

2.递推公式:if(nums[i]>nums[j])dp[i]=Math.max(dp[j]+1,dp[i])(如果遍历j从0到i-1,对所有满足nums[i]>nums[j]的j取dp[j]+1的最大值);

3.初始化:所有dp[i]=1(每一个i最长递增子序列大小至少都是1);

4.遍历顺序:从小到大。

代码

java 复制代码
class Solution {
    public int lengthOfLIS(int[] nums) {
        int dp[]=new int[nums.length];
        int res=1;
        for(int i=0;i<nums.length;i++)
            dp[i]=1;
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j])
                    dp[i]=Math.max(dp[j]+1,dp[i]);
                res=Math.max(dp[i],res);
            }
        }
        return res;
    }
}

☆☆☆☆☆leetcode 674. 最长连续递增序列

题目链接:leetcode 674. 最长连续递增序列

题目分析

1.dp数组含义:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度,取所有dp[i]中的最大值即为所求最长连续递增序列的长度;

2.递推公式:if(nums[i]>nums[i-1])dp[i]=dp[i-1]+1(如果nums[i]>nums[i-1],则取dp[i-1]+1);

3.初始化:所有dp[i]=1(每一个i最长递增子序列大小至少都是1);

4.遍历顺序:从小到大。

代码

java 复制代码
class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int dp[]=new int[nums.length];
        int res=1;
        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;
            res=Math.max(dp[i],res);
        }
        return res;
    }
}

☆☆☆☆☆leetcode 718. 最长重复子数组

题目链接:leetcode 718. 最长重复子数组

题目分析

1.dp数组含义:dp[i][j]表示以nums1[i-1]和nums2[j-1]为结尾的最长重复子数组长度,取所有dp[i][j]中的最大值即为所求最长重复子数组的长度;

2.递推公式:if(nums1[i-1]==nums2[j-1])dp[i][j]=dp[i-1][j-1]+1(如果结尾元素相等,dp[i][j]在dp[i-1][j-1]的基础上加一);

3.初始化:所有dp[i][0]=0,所有dp[0][j]=0;

4.遍历顺序:从小到大。

代码

java 复制代码
class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int dp[][]=new int[nums1.length+1][nums2.length+1];
        int res=0;
        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;
                res=Math.max(dp[i][j],res);
            }
        }
        return res;
    }
}
相关推荐
↣life♚17 分钟前
从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation & Promptable Segmentation
人工智能·深度学习·算法·sam·分割·交互式分割
zqh1767364646923 分钟前
2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)
人工智能·算法·阿里云·人工智能工程师·阿里云acp·阿里云认证·acp人工智能
fie888942 分钟前
用模型预测控制算法实现对电机位置控制仿真
算法
Kent_J_Truman1 小时前
【交互 / 差分约束】
算法
ghie90901 小时前
x-IMU matlab zupt惯性室内定位算法
人工智能·算法·matlab
开发游戏的老王1 小时前
[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)
笔记·学习·虚幻
Magnum Lehar1 小时前
3d游戏引擎的Utilities模块实现
c++·算法·游戏引擎
愚润求学2 小时前
【Linux】Ext系列文件系统
linux·运维·服务器·笔记
yzx9910133 小时前
支持向量机的回归用法详解
算法·支持向量机·回归
小羊在奋斗3 小时前
【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存
算法·leetcode·链表