【c++刷题笔记-动态规划】day43: 300.最长递增子序列 、 674. 最长连续递增序列、 718. 最长重复子数组

300. 最长递增子序列 - 力扣(LeetCode)

思路:让以当前的下标为i的数与i前面的所有数比较获取最大值

重点: dp[i]=max(dp[i],dp[j]+1);

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();
        if(n==1){
            return 1;
        }
        int ans=0;
        vector<int>dp(n,1);
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]){
                    //当前i与i前面的所有数字也就是每一个j比较获取最大值
                    dp[i]=max(dp[i],dp[j]+1);
                }
                if(dp[i]>ans){
                    ans=dp[i];
                }
            }
        }
        return ans;
    }
};

674. 最长连续递增序列 - 力扣(LeetCode)

思路:找出以i下标的数为结尾的个数,取最大值

重点:dp[i]=dp[i-1]+1;

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int n=nums.size();
        int ans=1;
        vector<int>dp(n,1);
        for(int i=1;i<n;i++){
            if(nums[i]>nums[i-1]){
                dp[i]=dp[i-1]+1;//以i下标的数为结尾的个数
            }
            if(dp[i]>ans){
                ans=dp[i];
            }
        }
        return ans;
    }
};

 718. 最长重复子数组 - 力扣(LeetCode)

思路:求以i-1和j-1为结尾的最大重复子数组,取最大值

重点:dp[i][j]=dp[i-1][j-1]+1; 因为相同的子数组所以要同时移动下标

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size(),n=nums2.size();
        int ans=0;
        vector<vector<int>>dp(m+1,vector<int>(n+1,0));
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(nums1[i-1]==nums2[j-1]){
                    dp[i][j]=dp[i-1][j-1]+1;
                }
                if(dp[i][j]>ans){
                    ans=dp[i][j];
                }
            }
        }
        return ans;
    }
};
class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size(),n=nums2.size();
        int ans=0;
        vector<int>dp(n+1,0);
        for(int i=1;i<=m;i++){
            for(int j=n;j>0;j--){
                if(nums1[i-1]==nums2[j-1]){
                    dp[j]=dp[j-1]+1;
                }else{
                    dp[j]=0;
                }
                if(dp[j]>ans){
                    ans=dp[j];
                }
            }
        }
        return ans;
    }
};

总结

子序列和子数组问题,使用以i-1为结尾统计每一个最大值

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 23:02:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 23:02:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 23:02:02       58 阅读
  4. Python语言-面向对象

    2024-07-18 23:02:02       69 阅读

热门阅读

  1. 线程池知识点

    2024-07-18 23:02:02       21 阅读
  2. LeetCode-计数质数

    2024-07-18 23:02:02       22 阅读
  3. Lua 数组

    2024-07-18 23:02:02       22 阅读
  4. 拯救SQL Server数据库事务日志文件损坏

    2024-07-18 23:02:02       19 阅读
  5. LeetCode题练习与总结:分数到小数--166

    2024-07-18 23:02:02       23 阅读
  6. 总结 Thread 类的基本用法

    2024-07-18 23:02:02       24 阅读
  7. C++打印

    2024-07-18 23:02:02       17 阅读
  8. opencv—常用函数学习_“干货“_4

    2024-07-18 23:02:02       21 阅读
  9. 计算机视觉篇1 计算机视觉概览

    2024-07-18 23:02:02       23 阅读