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;}
网友评论