一:题目
二:上码
class Solution {
public:/**思路:1.分析题意:这里的我们要求解的是最大值,那么我们的求解过程肯定是动态变化的,举个例子2 5 1 2 510 5 2 1 5 2 如果我们一开始就让nums1[1] = 5何 nums2[4] = 5 相连的话 那么我们肯定不会求解出最大值那么题目中的说的直线不相交的其实就是说明了 直线的相对位置不用改变,那么的话也就不会相交那么题目也就变成了 求两个序列的最长子序列2.动态规划五步走1>:确定dp数组以及下标的含义dp[i][j] 表示的是在nums1中[0,i-1]范围内 和 nums2[0,j-1]范围内的 最多的不相交的线我们用的i-1 和 j-1 那么我们的dp数组范围是比我们的nums的范围大一个单位的2>:确定dp数组的状态递推公式 if(num1[i-1] == nums[j-1]) dp[i][j] = dp[i-1][j-1] + 1;elsedp[i][j] = max(dp[i-1][j],dp[i]][j-1])//记住dp[i][j]的含义 表示的是在nums1中[0,i-1]... //最长的不相交的线 3>:确定dp数组的初始化04>:确定dp数组的遍历顺序哪个数组在外面都可以5>:举例验证**/int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {vector<vector<int> >dp(nums1.size()+1,vector<int>(nums2.size()+1,0));for (int i = 1; i <= nums1.size(); i++) {for (int j = 1; j <= nums2.size(); 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[nums1.size()][nums2.size()];}
};