Campo de treinamento de algoritmo Code Caprice dia 53 || 1143. Subsequência comum mais longa 1035. Linhas disjuntas 53. Subsequência máxima e programação dinâmica

Problema 1: 1143. Subsequência comum mais longa - LeetCode

Dadas duas strings  text1 e  , retorne o comprimento da maior subsequência comumtext2 dessas duas strings   .  Retorna  se não  existir nenhuma subsequência comum  .0

Uma subsequência de uma string   refere-se a uma nova string: é uma nova string formada pela exclusão de alguns caracteres (ou não exclusão de nenhum caractere) da string original sem alterar a ordem relativa dos caracteres.

  • Por exemplo, "ace" é  "abcde" uma subsequência de, mas  "aec" não  "abcde" uma subsequência de.

Uma subsequência comum de duas strings   é uma subsequência que ambas as strings têm em comum

Ideia: Definir um dp[i][j] bidimensional, que representa a subsequência comum mais longa das combinações i e j-ésima. Se o mesmo elemento for encontrado durante a travessia, então dp[i][j] = dp [i- 1][j-1]+1, o código é o seguinte:

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()];

    }
} ;      

Problema 2: 1035. Linhas Disjuntas - LeetCode

Dado um array de inteiros  nums , encontre um subarray contínuo com a soma máxima (o subarray contém pelo menos um elemento) e retorne sua soma máxima.

Um subarray  é uma parte contígua de um array.

Ideia: Pensar nesta questão é na verdade o mesmo que a maior subsequência comum, que pode ser obtida listando várias fórmulas recursivas. O código específico é o seguinte:

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;
    }
};

Problema 3: 53. Soma máxima do subarray - LeetCode

Dado um array de inteiros  nums , encontre um subarray contínuo com a soma máxima (o subarray contém pelo menos um elemento) e retorne sua soma máxima.

Um subarray  é uma parte contígua de um array.

Idéia: encontre a soma máxima da submatriz, dp representa a soma máxima da submatriz quando o i-ésimo elemento está presente, a fórmula recursiva é dp[i]=max(nums[i],dp[i-1]+ nums[i]), O código específico é o seguinte:

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;
    }
};

おすすめ

転載: blog.csdn.net/weixin_56969073/article/details/132637351