算法笔记|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;
    }
}
相关推荐
luckys.one1 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|3 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师3 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo33 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
汇能感知3 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun4 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
好家伙VCC4 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
茯苓gao4 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾4 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT5 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习