1143.最长公共子序列
链接:代码随想录
人间经典,动态规划
之后补上自己的图。
代码,一次做对
class Solution { public: int longestCommonSubsequence(string text1, string text2) { int n1=text1.size(); int n2=text2.size(); vector<vector<int>>dp(n1+1,vector<int>(n2+1,0)); for(int i=1;i<n1+1;i++) { for(int j=1;j<n2+1;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]); } } } /*检查递推的一个矩阵 for(int i=0;i<n1+1;i++) { for(int j=0;j<n2+1;j++) { cout<<dp[i][j]<<" "; } cout<<endl; }*/ return dp[n1][n2]; } };
1035.不相交的线
链接:代码随想录
看了20分钟,没思路捏。
阿哲,就是最长公共子序列。。。。。离谱。
感觉。。。。理解它和公共子序列问题一样还是需要一定门槛。
代码就是复制公共子序列的题。什么也没变。
53. 最大子序和-------------这道题做了很多遍,再做感觉没有印象
链接:代码随想录
说这道题用贪心做过。
class Solution { /* 这道题很经典。贪心解法 做了大概四五遍了,感觉解法还是记不住。动态规划稍微好记一些。 如果累积的和是负数,那么没必要保留这个数据,也只会拖累后面的。但是也有可能全部的数都是负数。 要是比较累加和和当前的nums[i] */ public: int maxSubArray(vector<int>& nums) { int n=nums.size(); if(n==1) { return nums[0]; } vector<int>dp(n,0); //dp[i]----代表以nums[i]为结尾的数组的最大和 dp[0]=nums[0]; int maxx=dp[0]; for(int i=1;i<n;i++) { dp[i]=max(dp[i-1]+nums[i],nums[i]); maxx=max(maxx,dp[i]); } return maxx; } };