美文网首页
代码随想录算法训练营第五十六天|1143.最长公共子序列、103

代码随想录算法训练营第五十六天|1143.最长公共子序列、103

作者: eagleX | 来源:发表于2023-10-02 17:04 被阅读0次

    1143.最长公共子序列

    动规五部曲

    确定dp数组(dp table)以及下标的含义

    dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]

    确定递推公式

    text1[i - 1] == text2[j - 1] dp[i][j] = dp[i - 1][j - 1] + 1;

    text1[i - 1] != text2[j - 1]  dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

    dp数组初始化

    dp[i][0] = 0  dp[0][j]=0

    确定遍历顺序

    要从前向后,从上到下来遍历这个矩阵。

    举例推导dp数组

    intlongestCommonSubsequence(string text1,string text2){vector<vector<int>>dp(text1.size()+1,vector<int>(text2.size()+1,0));for(inti=1;i<=text1.size();i++){for(intj=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]);}}}returndp[text1.size()][text2.size()];}

    1035.不相交的线 

    直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。

    同上题最长公共子序列

    53. 最大子序和  动态规划 

    动规五部曲

    确定dp数组(dp table)以及下标的含义

    dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]

    确定递推公式

    dp[i] = max(dp[i - 1] + nums[i], nums[i]);

    dp数组初始化

    dp[0] = nums[0]

    确定遍历顺序

    递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历

    举例推导dp数组

    intmaxSubArray(vector<int>&nums){if(nums.size()==0)return0;vector<int>dp(nums.size());dp[0]=nums[0];intresult=dp[0];for(inti=1;i<nums.size();i++){dp[i]=max(dp[i-1]+nums[i],nums[i]);// 状态转移公式if(dp[i]>result)result=dp[i];// result 保存dp[i]的最大值}returnresult;}

    相关文章

      网友评论

          本文标题:代码随想录算法训练营第五十六天|1143.最长公共子序列、103

          本文链接:https://www.haomeiwen.com/subject/kfvsbdtx.html