自学内容网 自学内容网

代码随想录day43 动态规划10

题目:300.最长递增子序列  674.最长连续递增序列   718.最长重复子数组

需要重做:全部

300.最长递增子序列

思路:dp【i】需要一点点推,从前往后,而且需要遍历i之前的每一个,才能确定。

什么时候子序列可以加上dp【i】:当num【i】比num【j】大的时候。

需要双层循环,且i在外层

注意:

五部:

1.dp[i]:以nums【i】结尾的,最长子序列的长度

2.  if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);

3.  dp[0]=1;

4.

代码:

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();
        if(n==1)return 1;
        vector<int>dp(n,1);
        int res=0;
        for(int i=1;i<n;i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]){//如果nums[i]可以接在j后面。
                    dp[i]=max(dp[i],dp[j]+1);
                }
            }
            if(dp[i]>res)res=dp[i];
        }
        return res;
    }
};

674. 最长连续递增序列

法1:贪心:

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int n=nums.size();
        if(n==1)return 1;
        int res=0;
        int tmp=1;
        for(int i=0;i<n-1;i++){
            if(nums[i]<nums[i+1]){
                tmp++;
                res=max(res,tmp);
            }
            else{
                res=max(res,tmp);
                tmp=1;
            }
        }
        return res;
    }
};

法2:dp

思路:遍历一次即可,只要比上一个大就=上一个再加1;并设置最大值,每次比较。

注意:

代码:

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int n=nums.size();
        if(n==1)return 1;
        int res=0;
        vector<int>dp(n,1);
        for(int i=1;i<n;i++){
            if(nums[i]>nums[i-1]){
                dp[i]=dp[i-1]+1;
            }
            res=max(res,dp[i]);
        }
        return res;
    }
};

718. 最长重复子数组

思路:暴力难做,考虑dp

注意:为什么要让i,j为下标i-1,j-1:因为我们在循环的时候要用到dp【i-1】【j-1】,这样的话,循环初始值就是1,不用考虑为负数的情况,便于理解。

五部:

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

2.if(nums1[i-1]==nums1[j-1])dp[i][j]=dp[i-1][j-1]+1;

3.全部初始化0即可。对于第0行和第0列的,都初始化为0,因为已经是0了所以不写

4.

代码:

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        int n1=nums1.size();
        int n2=nums2.size();
        int res=0;
        vector<vector<int>>dp(n1+1,vector<int>(n2+1,0));
        for(int i=1;i<=n1;i++){
            for(int j=1;j<=n2;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;
    }
};


原文地址:https://blog.csdn.net/m0_74187270/article/details/145228306

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!