1035. 不相交的线

摘要
Title: 1035. 不相交的线
Categories:

Powered by:NEFU AB-IN

Link

1035. 不相交的线

题意

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。

现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足:

nums1[i] == nums2[j]
且绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

以这种方法绘制线条,并返回可以绘制的最大连线数。

思路

  1. lcs 模板题
  2. 瞎写的记忆化搜索,类似二分图匹配的思路

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:
m, n = len(nums1), len(nums2)
dp = [[0] * (n + 1) for _ in range(m + 1)]

for i, num1 in enumerate(nums1):
for j, num2 in enumerate(nums2):
if num1 == num2:
dp[i + 1][j + 1] = dp[i][j] + 1
else:
dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j])

return dp[m][n]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
'''
Author: NEFU AB-IN
Date: 2024-08-11 12:15:08
FilePath: \LeetCode\1035\1035.py
LastEditTime: 2024-08-11 17:43:33
'''
# 3.8.19 import
import random
from collections import Counter, defaultdict, deque
from datetime import datetime, timedelta
from functools import lru_cache, reduce
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from itertools import combinations, compress, permutations, starmap, tee
from math import ceil, comb, fabs, floor, gcd, hypot, log, perm, sqrt
from string import ascii_lowercase, ascii_uppercase
from sys import exit, setrecursionlimit, stdin
from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar, Union

# Constants
TYPE = TypeVar('TYPE')
N = int(2e5 + 10)
M = int(20)
INF = int(1e12)
OFFSET = int(100)
MOD = int(1e9 + 7)

# Set recursion limit
setrecursionlimit(int(2e9))


class Arr:
array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)])
array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)])
graph = staticmethod(lambda size=N: [[] for _ in range(size)])


class Math:
max = staticmethod(lambda a, b: a if a > b else b)
min = staticmethod(lambda a, b: a if a < b else b)


class IO:
input = staticmethod(lambda: stdin.readline().rstrip("\r\n"))
read = staticmethod(lambda: map(int, IO.input().split()))
read_list = staticmethod(lambda: list(IO.read()))


class Std:
pass

# ————————————————————— Division line ——————————————————————


class Solution:
def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:
cnt2_ = defaultdict(list)
for i, num in enumerate(nums2):
cnt2_[num].append(i)

ans = 0

@cache
def dfs(index1, l, cnt):
nonlocal ans
ans = Math.max(ans, cnt)
if index1 == len(nums1):
return
num = nums1[index1]
for index2 in cnt2_[num]:
if index2 > l:
dfs(index1 + 1, index2, cnt + 1)

dfs(index1 + 1, l, cnt)

dfs(0, -1, 0)
return ans
使用搜索:谷歌必应百度