アルゴリズム質問チェックイン 52 日目 - 動的プログラミング | 300. 最長増加部分列、674. 最長連続増加列、718. 最長繰り返し部分配列

300. 最長の増加サブシーケンス - LeetCode
ステータス: AC

元の順序を変更せずにサブシーケンス内の一部の要素を削除することができます。判定には二重走査が必要です。コードは次のとおりです。

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

674. 最長連続増加シーケンス - LeetCode
ステータス: AC

増加するシーケンスは連続したサブシーケンスです。ちょっとしたコツは、最終的な答えを更新するループに入れることです。コードは次のとおりです。

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

718. 最も長く繰り返される部分配列 - LeetCode
ステータス: AC

前の質問の改良版であるコードは次のとおりです。

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

おすすめ

転載: blog.csdn.net/qq_40395888/article/details/132621810