classSolution: defLCS(self , s1: str, s2: str) -> str: # write code here n = len(s1) m = len(s2) dp = [[0]*(m+1) for i inrange(n+1)]
for i inrange(1, n+1): for j inrange(1, m+1): # 判断字符是否在最长子序列中 if s1[i-1] == s2[j-1]: # 该字符一定在最长子序列中 dp[i][j] = dp[i-1][j-1] + 1 else: # 如果不等的话有3种情况, # s1[i]是、s2[j]是或者两者都不是 # 第三种情况可以被前两种组合表示 dp[i][j] = max(dp[i][j-1], dp[i-1][j]) # 通过回溯构造解 i, j = n, m k = dp[i][j] lcs = "" while i > 0and j > 0and k > 0: while dp[i][j] == dp[i-1][j] and i > 0: i = i - 1 while dp[i][j] == dp[i][j-1] and j > 0: j = j - 1
classDSU: def__init__(self, N): self.root = [i for i inrange(N)] self.rank = [1for i inrange(N)] deffind(self, k): if self.root[k] == k: return k return self.find(self.root[k]) defunion(self, node1, node2): # 查找根 x = self.find(node1) y = self.find(node2) if x == y: returnFalse # 比较秩 if self.rank[x] < self.rank[y]: x, y = y, x # 执行合并操作 self.rank[x] += self.rank[y] self.root[y] = x returnTrue
selected_nodes = {0} candidate_nodes = {i for i inrange(1, N)}
# 逐步加入 selected_edge_num = 0 while selected_num < N-1: step_min_cost = float('inf') start, end = 0, 0 for i in selected_nodes: for j in candidate_nodes: if distance_map[i][j] < min_cost: step_min_cost = distance_map[start][end] start = i end = j # 更新选择节点 selected_nodes.add(end) candidate_nodes.remove(end) selected_edge_num += 1 min_cost += step_min_cost
d = [float('inf') for i inrange(N)] vis = [Falsefor i inrange(N)] d[0] = 0 for _ inrange(N): # 寻找这轮最小d step_min_cost = float('inf') node = 0 for i inrange(N): ifnot vis[i] and d[i] < step_min_cost: node = i step_min_cost = d[i] vis[node] = True min_cost += step_min_cost
# 更新与这个顶点相连的最小距离 for i inrange(N): ifnot vis[i]: d[i] = min(distance_map[i][node], d[i])
N = len(points) # prim算法 selected_nodes = {0} candidate_nodes = set([i for i inrange(1, N)]) min_cost = 0
# 计算两两之间距离 distance_map = [[0for i inrange(N)] for j inrange(N)] for i inrange(N): for j inrange(i+1, N): distance_map[i][j] = abs(points[i][0] - points[j][0]) + abs(points[i][1] - points[j][1]) distance_map[j][i] = distance_map[i][j]
d = [float('inf') for i inrange(N)] vis = [Falsefor i inrange(N)] d[0] = 0 for _ inrange(N): # 寻找这轮最小d step_min_cost = float('inf') node = 0 for i inrange(N): ifnot vis[i] and d[i] < step_min_cost: node = i step_min_cost = d[i] vis[node] = True min_cost += step_min_cost
# 更新与这个顶点相连的最小距离 for i inrange(N): ifnot vis[i]: d[i] = min(distance_map[i][node], d[i]) return min_cost
classDSU: def__init__(self, N): self.root = [i for i inrange(N)] self.rank = [1for i inrange(N)] deffind(self, k): if self.root[k] == k: return k return self.find(self.root[k]) defunion(self, node1, node2): # 查找根 x = self.find(node1) y = self.find(node2) if x == y: returnFalse # 比较秩 if self.rank[x] < self.rank[y]: x, y = y, x # 执行合并操作 self.rank[x] += self.rank[y] self.root[y] = x returnTrue