leetcode 1035. Uncrossed Lines 解法 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]
                

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章