动态规划Day31:子序列长度1

300. 最长递增子序列

dp[i] 表示「以 nums[i] 为最后一个元素」的最长递增子序列长度 ------ 这意味着:

  • dp 数组里的每个值,只代表 "以对应位置结尾" 的子序列长度;

  • 整个数组的最长递增子序列,不一定以最后一个元素结尾

所以还需要一个res去存储出现过的最大dp[i]

j用来遍历,寻找i能够插入的最大子序列长度的末尾

cpp 复制代码
    int lengthOfLIS(vector<int>& nums) {
        if(nums.size() == 1){
            return 1;
        }
        vector<int> dp(nums.size(), 1);
        int res = 0;
        for(int i = 1; i < nums.size(); i++){
            for(int j = 0; j < i; j++) {
                if(nums[j] < nums[i]){
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
            res = max(res, dp[i]);
        }
        return res;
    }

674. 最长连续递增序列

是连续,只需要和前一个对比,所以只需要一层循环

cpp 复制代码
    int findLengthOfLCIS(vector<int>& nums) {
        if(nums.size() <= 1){
            return nums.size();
        }
        vector<int> dp(nums.size(), 1);
        int res = 1;
        for(int i = 1; i < nums.size(); i++){
            if(nums[i] > nums[i - 1]){
                dp[i] = dp[i - 1] + 1;
                res = max(res, dp[i]);
            }
        }
        return res;
    }

718. 最长重复子数组

d[i][j]代表以i - 1,j - 1 为结尾的最长子串长度

(因为这样可以方便初始化,可以直接将无意义的第一行dp[0][j]与第一列dp[0][j]全部设为0,若代表i,j结尾的子串长度 初始化时还需要额外进行一个比较判断其是否相等才可以赋值)

初始化全部为0

状态转移:i-1 和 j-1 元素相等时,dp[i][j] = dp[i - 1][j - 1] + 1

遍历顺序:左到右 上到下

cpp 复制代码
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
        int res = 0;
        for(int i = 1; i < nums1.size() + 1; i++){
            for(int j = 1; j < nums2.size() + 1; j++){
                if(nums1[i - 1] == nums2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    res = max(res, dp[i][j]);
                }
            }
        }
        return res;
    }
相关推荐
逻辑驱动的ken1 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
帅小伙―苏1 小时前
力扣42接雨水
前端·算法·leetcode
AI科技星2 小时前
精细结构常数α的几何本源:从第一性原理的求导证明、量纲分析与全域验证
算法·机器学习·数学建模·数据挖掘·量子计算
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
MegaDataFlowers2 小时前
26.删除有序数组中的重复项
算法
故事和你913 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
吴可可1233 小时前
C#合并首尾相连多段线实战
算法·c#
KMDxiaozuanfeng4 小时前
卡梅德生物技术快报|SPR 技术应用|基于 SPR 亲和力的中药活性成分筛选系统实现与数据分析
科技·算法·面试·考试
꧁细听勿语情꧂5 小时前
数据结构概念和算法、时间复杂度、空间复杂度引入
c语言·开发语言·数据结构·算法
Felven5 小时前
B. The 67th 6-7 Integer Problem
数据结构·算法