一:题目
二:上码
class Solution {
public:
/**
思路:
1.分析题意:
这里的我们要求解的是最大值,那么我们的求解过程肯定是动态变化的,举个例子
2 5 1 2 5
10 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;
else
dp[i][j] = max(dp[i-1][j],dp[i]][j-1])//记住dp[i][j]的含义 表示的是在nums1中[0,i-1]... //最长的不相交的线
3>:确定dp数组的初始化
0
4>:确定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()];
}
};