题目描述

本题本质上就是求nums1和nums2的最长公共子序列的长度。因此本题本质上与第1143题一模一样。
代码:
cpp
class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
//本题等价于求nums1和nums2的最长公共子序列的长度
int len1 = nums1.size();
int len2 = nums2.size();
//i的取值范围是[1,len1]
//j的取值范围是[1,len2]
//dp[i][j]表示nums1[0,i-1]和nums2[0,j-1]的最长公共子序列的长度
//dp[0][j]表示nums1为空,此时不存在公共子序列,dp[0][j]都应该等于0
//dp[i][0]表示nums2为空,此时不存在公共子序列,dp[i][0]都应该等于0
//i!=0 且 j!=0时,有两种可能:
//如果nums1[i-1]等于nums2[j-1],dp[i][j]=dp[i-1][j-1]+1,dp[i][j]由前面的dp[i-1][j-1]覆盖,可以不初始化,或者为了编码方便可以统一初始化为0
//如果nums1[i-1]不等于nums2[j-1],dp[i][j]=max(dp[i-1][j],dp[i][j-1]),dp[i][j]由前面的dp[i-1][j]或者dp[i][j-1]覆盖,可以不初始化,或者为了编码方便可以统一初始化为0
vector<vector<int>> dp(len1+1,vector<int>(len2+1,0));
for(int i = 1;i <= len1;i++){
for(int j =1;j <= len2;j++){
if(nums1[i-1] == nums2[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[len1][len2];
}
};