总结:
1)dp(动态规划) 初见已经忘记了属于dp类型,按照题目三个用例,eg:第一个最长就是1、4,那么证明1、4就是两个数组里面的最长公共子序列。
2)这个时候就分为两种情况,按照求最长公共子序列,就分为:最后一个数字是否相等 。
1.若相等:if(nums1[i-1]==nums2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
2.若不相等:else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
那么就是如果不相等,就是在nums1的0~i 与nums2的0~j-1 里面查找最长子数组 或者在nums1的0~i-1 与 nums2 的0~j里面进行查找,去最大值
3)初始化问题:由于dp存在i-1 与 j-1 那么就多加一行和一列,为了不影响dp[1][1]取值,就把第一行和第一列初始化为0
4)取值方向,由dp[i-1][j-1] dp[i][j-1] dp[i-1][j] 三个方向来求dp[i][j]那么就是从左向右,从上向下
5)返回值:最后返回dp[m][n]就是最后数组要求的最大公共子序列
class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size(),n=nums2.size();
vector<vector<int>> dp(m+1,vector<int>(n+1));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(nums1[i-1]==nums2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
}
return dp[m][n];
}
};