题目:
在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。
现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:
- nums1[i] == nums2[j]
- 绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
以这种方法绘制线条,并返回可以绘制的最大连线数。
解题思路:
遇到最大连接数问题首先想到动态规划。【动态规划】
定义dp[i][j]表示nums1前i个数与nums2前j个数可组成的最大连接数
如果nums1第i个和nums2第j个数字相同则dp[i][j]=dp[i-1][j-1]+1;如果能想到这一点后面就差不多能想出来了。
想一想其他情况怎么处理~
如果nums1第i和nums2第j个不相等,那说明最后面那根线段绝对不会同时用到第i和第j这两个数,最多用到其中之一,那么dp[i][j] = dp[i-1][j]或者dp[i][j-1],谁最大取谁。
动态规划另一个需要注意的问题,能把dp[i][j]的情况想到,其实就解决了,不用去钻dp[i][j-1]这些怎么求,因为你迭代到i,j时说明已经遍历过前面的值。考虑到i=0或j=0的边界赋值问题就可以了。
参考:
数据结构和算法1035.不相交的线段
Java代码
class Solution {
pub