【代码随想录】Day52 动态规划13

第一题

 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

dp[i]:以nums[i]为结尾的最长递增子序列长度

递推公式:dp[i] = max(dp[j] +1,dp[i]) 

第三题

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 建立二维DP数组,行i为nums1,列j为nums2,dp[i][j]表示nums1[i-1]和nums[j-1]为尾数的子序列长度,因为这里是表示i-1和j-1,所以在构造dp时必须多构造一位,以便在for遍历的时候可以等于size(),nums1和nums2的共同子序列一定是同进退的,所以只有当nums1[i-1] == nums2[j-1]时,才更新dp[i][j]:

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 res = 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] > res) res = dp[i][j];
            }
        }
        return res;

    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43785314/article/details/132677624