leetcode 1035. Uncrossed Lines 解法 python

本文深入探讨了LeetCode上一道动态规划题目,通过实例详细解释了如何利用动态规划求解最大不相交线数量的问题。文章提供了清晰的解决思路和Python源码实现,适合初学者理解和掌握动态规划的基本原理。

一.问题描述

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. 1 <= A.length <= 500
  2. 1 <= B.length <= 500
  3. 1 <= 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]
                

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值