• @ 代码随想录算法训练营第8周(C语言)|Day56(动态规划)


    @ 代码随想录算法训练营第8周(C语言)|Day56(动态规划

    Day56、动态规划(包含题目 ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组 )

    300.最长递增子序列

    题目描述

    给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

    子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

    题目解答

    int lengthOfLIS(int* nums, int numsSize) {
        int *dp=(int*)malloc(sizeof(int)*numsSize);
        int res=0;
        dp[0]=1;
        for(int i=1;i<numsSize;i++){
            dp[i]=1;
            for(int j=0;j<i;j++){
                if(nums[j]<nums[i]){
                    dp[i]=fmax(dp[i],dp[j]+1);
                }
                
            }
            res=fmax(dp[i],res);
    
        }
    
        return res;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    题目总结

    dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。

    674. 最长连续递增序列

    题目描述

    给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

    连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。

    题目解答

    int findLengthOfLCIS(int* nums, int numsSize) {
        if(numsSize==1){
            return 1;
        }
        int *dp=(int*)malloc(sizeof(int)*numsSize);
        int res=0;
        dp[0]=1;
        for(int i=1;i<numsSize;i++){
            if(nums[i]>nums[i-1]){
                dp[i]=dp[i-1]+1;
            }else{
                dp[i]=1;
            }
            res=fmax(res,dp[i]);
        }
        return res;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    题目总结

    dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]。。

    718. 最长重复子数组

    题目描述

    给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

    题目解答

    int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size) {
        int**dp=(int**)malloc(sizeof(int*)*(nums1Size+1));
        for(int i=0;i<nums1Size+1;i++){
            dp[i]=(int*)malloc(sizeof(int)*(nums2Size+1));
        }
        for(int i=0;i<nums1Size+1;i++){
            dp[i][0]=0;
    
        }
        for(int i=0;i<nums2Size+1;i++){
            dp[0][i]=0;
    
        }
        int res=0;
        for(int i=1;i<nums1Size+1;i++){
            for(int j=1;j<nums2Size+1;j++){
                if(nums1[i-1]==nums2[j-1]){
                    dp[i][j]=dp[i-1][j-1]+1;
    
                }else{
                    dp[i][j]=0;
                }
                res=fmax(res,dp[i][j]);
            }
        }
    
        return res;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    题目总结

    dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。。

  • 相关阅读:
    RFID 完整指南:优点、应用和挑战
    cwebscaner不显示网站
    注解在Java中有什么用?请给出示例
    IO系列(八) -浅析NIO工作原理
    【入门到精通】「Java工程师全栈知识路线」
    JavaScript 19 JavaScript 字符串方法
    TypeScript 地图标记案例
    数据分析:智能企业七步曲(一)
    胆固醇-聚乙二醇-人血清白蛋白,Cholesterol-PEG-HSA简介;CLS-PEGHSA
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(1)
  • 原文地址:https://blog.csdn.net/fu1034810010/article/details/136222380