算法笔记|Day37动态规划X

算法笔记|Day37动态规划X

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

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

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

题目分析

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

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

3.初始化:所有dpi=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数组含义:dpi表示i之前包括i的以numsi结尾的最长递增子序列的长度,取所有dpi中的最大值即为所求最长连续递增序列的长度;

2.递推公式:if(numsi>numsi-1)dpi=dpi-1+1(如果numsi>numsi-1,则取dpi-1+1);

3.初始化:所有dpi=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数组含义:dpij表示以nums1i-1和nums2j-1为结尾的最长重复子数组长度,取所有dpij中的最大值即为所求最长重复子数组的长度;

2.递推公式:if(nums1i-1==nums2j-1)dpij=dpi-1j-1+1(如果结尾元素相等,dpij在dpi-1j-1的基础上加一);

3.初始化:所有dpi0=0,所有dp0j=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;
    }
}
相关推荐
Jasmine_llq1 分钟前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
the3clipse1 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE1 小时前
10.4【A】
算法
做运维的阿瑞1 小时前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
@Mike@1 小时前
12-数据库学习笔记(五种连接算法)
数据库·笔记·学习
韩明君1 小时前
alacrity学习笔记
笔记·学习
Godspeed Zhao1 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)1 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
Omics Pro1 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy1 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配