动态规划---不相交的线
题目:
在两条独立的水平线上按给定的顺序写下 nums1
和 nums2
中的整数。
现在,可以绘制一些连接两个数字 nums1[i]
和 nums2[j]
的直线,这些直线需要同时满足:
-
nums1[i] == nums2[j]
- 且绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
以这种方法绘制线条,并返回可以绘制的最大连线数。
思路:
1.确定dp数组及含义
dp[i][j]代表长度[0,i-1]的数组nums1,长度[0,j-1]的数组nums2的最长公共子序列长度
2.确定递推公式
如果nums1[i]=nums2[j],那么遇到了一个相同的数字,dp[i][j]=dp[i-1][j-1]+1
如果nums1[i]不等于nums2[j],那么dp[i][j]=max(dp[i-1][j],dp[i][j-1])
3.初始化dp数组
所有元素初始化为0
4.确定遍历顺序
外层for循环遍历nums1数组,内层for循环遍历nums2数组,从小到大遍历
代码:
public int maxUncrossedLines(int[] nums1, int[] nums2) {int[][] dp=new int[nums1.length+1][nums2.length+1];for(int i=1;i<=nums1.length;i++){for(int j=1;j<=nums2.length;j++){if(nums1[i-1]==nums2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);}}}return dp[nums1.length][nums2.length];}