Jour de camp d'entraînement sur l'algorithme Code Caprice53 || 1143. Sous-séquence commune la plus longue 1035. Lignes disjointes 53. Sous-séquence maximale et programmation dynamique

Problème 1 : 1143. Sous-séquence commune la plus longue - LeetCode

Étant donné deux chaînes  text1 et  , renvoie la longueur de la sous-séquence communetext2 la plus longue de ces deux chaînes   .  Renvoie  si aucune  sous-séquence commune n'existe  .0

Une sous-séquence d'une chaîne   fait référence à une telle nouvelle chaîne : il s'agit d'une nouvelle chaîne formée en supprimant certains caractères (ou en ne supprimant aucun caractère) de la chaîne d'origine sans changer l'ordre relatif des caractères.

  • Par exemple, "ace" est  "abcde" une sous-séquence de , mais  "aec" pas  "abcde" une sous-séquence de .

Une sous-séquence commune de deux chaînes   est une sous-séquence que les deux chaînes ont en commun

Idée : définir un dp[i][j] bidimensionnel, qui représente la plus longue sous-séquence commune des combinaisons i et j. Si le même élément est trouvé lors du parcours, alors dp[i][j] = dp [i- 1][j-1]+1, le code est le suivant :

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<vector<int>> dp(text1.size()+1,vector<int>(text2.size()+1,0));
            for(int i = 1;i <= text1.size();i++){
                for(int j = 1; j <= text2.size();j++){
                    if(text1[i-1] == text2[j-1]){
                        dp[i][j] = dp[i-1][j-1] + 1;
                    }
                    else{
                        dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
                    }
                }
            }
        return dp[text1.size()][text2.size()];

    }
} ;      

Problème 2 : 1035. Lignes disjointes - LeetCode

Étant donné un tableau d'entiers  nums , veuillez trouver un sous-tableau continu avec la somme maximale (le sous-tableau contient au moins un élément) et renvoyer sa somme maximale.

Un sous-tableau  est une partie contiguë d'un tableau.

Idée : Réfléchir à cette question revient en fait à la sous-séquence commune la plus longue, qui peut être obtenue en listant plusieurs formules récursives. Le code spécifique est le suivant :

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

Problème 3 : 53. Somme maximale du sous-tableau - LeetCode

Étant donné un tableau d'entiers  nums , veuillez trouver un sous-tableau continu avec la somme maximale (le sous-tableau contient au moins un élément) et renvoyer sa somme maximale.

Un sous-tableau  est une partie contiguë d'un tableau.

Idée : trouver la somme maximale du sous-tableau, dp représente la somme maximale du sous-tableau lorsque le i-ème élément est présent, la formule récursive est dp[i]=max(nums[i],dp[i-1]+ nums[i]), Le code spécifique est le suivant :

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

Je suppose que tu aimes

Origine blog.csdn.net/weixin_56969073/article/details/132637351
conseillé
Classement