一、题目描述
链接直达1035. 不相交的线
二、思路分析
题目要求:
- 两数组对应相等的两个点可以连成线
- 所有连成的线不能相交
就是说从两个数组中取出相等点对,而且点对的相对顺序是不变的。即求最大公共子序列。
利用动态规划,设dp[i][j]
表示当数组分别长为i
和j
时最大公共子序列的长度。
- 边界情况:当
i
和j
任意一方为零时,即序列长度为零,自然公共子序列也为零。 - 状态转移方程:当
nums1[i]=nums2[j]
时,自然dp[i][j] = dp[i - 1][j - 1] + 1
,关键不等时,dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])
,有人会疑惑dp[i - 1][j]
或者dp[i][j - 1]
是已知的吗?观察下列代码,的确之前已经求过了,所以是没有问题的。
/**
* @Author TieJianKuDan
* @Date 2021/5/21 19:19
* @Description 1035. 不相交的线
* @Since version-1.0
*/
public class MaxUncrossedLines {
public static void main(String[] args) {
}
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];
}
}
三、后记
动态规划题目,决定好dp数组的定义,谨记能够影响当前dp[i][j]…[x]的值的情况只有之前的结果,就把他当成最后一个结果。递推公式不要求所有的索引都小于当前索引,只要有一个小于就行。