代码随想录训练营第五十二天

1.最长递增子序列 题300

①dp[i]的定义

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

②dp的递推公式

位置i的最长递增子序列等于j从0到i-1各个位置的最长递增子序列+1的最大值。

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if (nums.size() <= 1) return nums.size();
        vector<int> dp(nums.size(), 1);
        int result = 0;
        for (int i = 1; i < nums.size(); i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
            }
            if (dp[i] > result) result = dp[i]; // 取长的子序列
        }
        return result;
    }
};

2.最长连续递增子序列 题674

①dp数组的含义

以i结尾的最长连续递增子序列的长度,不一定以下标0开始。

②递推公式

如果nums[i+1] > nums[i-1],那么dp[i] = dp [i-1] +1 ,实际上这才是正宗的递推公式,不一定要用到max函数

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        if(nums.size() <= 1){
            return nums.size();
        }
        vector<int> dp(nums.size(),1);
        int result = 0;
        for(int i = 1;i < nums.size();i++){
            if(nums[i] > nums[i-1]){
                dp[i] = dp[i-1] + 1;
                cout<<dp[i]<<endl;
            }
            else{    //这里可以不用,因为只要不符合>的条件,dp[i]并没有赋值,还是初始化的1。而当i跳到下一个,而那时i的前一个dp[i-1]仍然是初始化的1。
                dp[i] = 1;
            }
            if(dp[i] >= result){
                result = dp[i];
            }
        }
        return result;
    }
};

3.最长重复子数组 题718

①dp的含义

这里用二维dp数组。dp[i] [j] 表示nums1以i-1为结尾,nums2以j-1为结尾的的最长重复子数组。

如果定义 dp[i] [j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要进行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i] [0]就要初始为1, 因为此时最长重复子数组为1,而这样就要遍历nums1所有元素是否和nums[2]相等了。

②递推公式

如果nums1[i-1] = nums2 [j-1] ,那么dp[i] [j] = dp[i-1] [j-1] +1。

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

你可能感兴趣的:(算法,动态规划,leetcode)