一.问题描述
Example 1:

Input: A = [1,4,2], B = [1,2,4]
Output: 2
Explanation: We can draw 2 uncrossed lines as in the diagram.
We cannot draw 3 uncrossed lines, because the line from A[1]=4 to B[2]=4 will intersect the line from A[2]=2 to B[1]=2.
Example 2:
Input: A = [2,5,1,2,5], B = [10,5,2,1,5,2]
Output: 3
Example 3:
Input: A = [1,3,7,1,7,5], B = [1,9,2,5,1]
Output: 2
Note:
1 <= A.length <= 5001 <= B.length <= 5001 <= A[i], B[i] <= 2000
二.解决思路
这是一道动态规划的题目,说实话我动态规划写的很少,所以花了很多时间去理解
本题主要是遍历一条线上的点,然后与另一条线上的所有点判断
dp[i]代表从A线到B线的0~i点的最大不相交线的数量
我们迭代A上的每一个点一步步更新dp[i]
在每一个迭代步,dp[i]的含义是,从A线的0-k点,到B线的0-i点最大的不相交线数量
A上的每个点迭代完,dp[lenB]则是完整的A线到B线的最不不相交线数量
感觉动态规划还是很难解释
纸上写了三页,你们尽量理解吧。。。不懂的评论
同时要注意一个线上的点只能与另外线上的一个点相连,这是为啥第二个for循环反转的原因

更多leetcode算法题解法请关注我的专栏leetcode算法从零到结束或关注我
欢迎大家一起套路一起刷题一起ac
三.源码
开头让A作为长度较长的那个是为了减少计算量,算法复杂度是O(lenA*lenB^2),lenB小时间复杂度会小点,当然不做这步处理也能AC
class Solution:
def maxUncrossedLines(self, A: List[int], B: List[int]) -> int:
if len(A)<len(B):
tmp=A
A=B
B=tmp
lenA=len(A)
lenB=len(B)
dp=[0]*(lenB+1)
for i in range(lenA):
# pay attention to the reversion
for t in range(lenB)[::-1]:
if A[i]==B[t]:dp[t+1]=dp[t]+1
for k in range(lenB):
dp[k+1]=max(dp[k+1],dp[k])
return dp[lenB]
本文深入探讨了LeetCode上一道动态规划题目,通过实例详细解释了如何利用动态规划求解最大不相交线数量的问题。文章提供了清晰的解决思路和Python源码实现,适合初学者理解和掌握动态规划的基本原理。
1406

被折叠的 条评论
为什么被折叠?



