算法笔记|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;
    }
}
相关推荐
Hello_Embed20 小时前
libmodbus 移植 STM32(USB 串口后端篇)
笔记·stm32·单片机·嵌入式·freertos·libmodbus
张祥64228890420 小时前
RTKLIB源码和理论结合分析笔记三
笔记
日更嵌入式的打工仔20 小时前
0欧电阻作用
笔记
CoderCodingNo20 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
wdfk_prog20 小时前
[Linux]学习笔记系列 -- [drivers][I2C]I2C
linux·笔记·学习
大闲在人21 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
小熳芋21 小时前
443. 压缩字符串-python-双指针
算法
2501_9248787321 小时前
数据智能驱动进化:AdAgent 多触点归因与自我学习机制详解
人工智能·逻辑回归·动态规划
Charlie_lll21 小时前
力扣解题-移动零
后端·算法·leetcode
chaser&upper21 小时前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法