蓝桥杯上岸每日N题第二期(一)!!!
发布人:shili8
发布时间:2025-01-10 22:06
阅读次数:0
**蓝桥杯上岸每日N题第二期(一)****前言**
蓝桥杯是中国的一项编程竞赛活动,由蓝桥网主办。它旨在培养学生的编程能力、逻辑思维和问题解决能力。蓝桥杯的题目涵盖了计算机基础知识、算法设计、数据结构等多个方面。
本文将介绍蓝桥杯上岸每日N题第二期(一)的内容,包括题目描述、代码示例和注释。
**第一题:最长公共子序列**
问题描述:
给定两个字符串S1和S2,请找出它们的最长公共子序列(LCS)。
输入:
* S1:第一个字符串* S2:第二个字符串输出:
* LCS:最长公共子序列示例:
输入:S1 = "AGGTAB", S2 = "GXTXAYB"
输出:"GTAB"
def longest_common_subsequence(S1, S2): m, n = len(S1), len(S2) dp = [[0] * (n +1) for _ in range(m +1)] for i in range(1, m +1): for j in range(1, n +1): if S1[i -1] == S2[j -1]: dp[i][j] = dp[i -1][j -1] +1 else: dp[i][j] = max(dp[i -1][j], dp[i][j -1]) lcs = [] i, j = m, n while i >0 and j >0: if S1[i -1] == S2[j -1]: lcs.append(S1[i -1]) i -=1 j -=1 elif dp[i -1][j] > dp[i][j -1]: i -=1 else: j -=1 return "".join(reversed(lcs)) S1 = "AGGTAB" S2 = "GXTXAYB" print(longest_common_subsequence(S1, S2)) # 输出:"GTAB"
**第二题:最小生成树**
问题描述:
给定一个带权图,请找出其最小生成树。
输入:
* G:带权图* V:顶点集输出:
* T:最小生成树示例:
输入:
G = {
"A": {"B":2, "C":3},
"B": {"A":2, "D":1},
"C": {"A":3, "F":4},
"D": {"B":1, "E":5},
"E": {"D":5, "F":6},
"F": {"C":4, "E":6}
}
输出:
T = {
"A": {"B":2},
"B": {"A":2},
"C": {},
"D": {},
"E": {},
"F": {}
}
import heapqdef minimum_spanning_tree(G): V = set(G.keys()) T = {} visited = set() pq = [(0, "A", "B")] # (weight, u, v) while pq: weight, u, v = heapq.heappop(pq) if u not in visited or v not in visited: visited.add(u) visited.add(v) T[u] = {v: weight} T[v] = {u: weight} return TG = { "A": {"B":2, "C":3}, "B": {"A":2, "D":1}, "C": {"A":3, "F":4}, "D": {"B":1, "E":5}, "E": {"D":5, "F":6}, "F": {"C":4, "E":6} } print(minimum_spanning_tree(G))
**第三题:最短路径**
问题描述:
给定一个带权图,请找出从源点到目标点的最短路径。
输入:
* G:带权图* S:源点* T:目标点输出:
* P:最短路径示例:
输入:
G = {
"A": {"B":2, "C":3},
"B": {"A":2, "D":1},
"C": {"A":3, "F":4},
"D": {"B":1, "E":5},
"E": {"D":5, "F":6},
"F": {"C":4, "E":6}
}
S = "A"
T = "F"
输出:
P = ["A", "B", "D", "E", "F"]
import heapqdef shortest_path(G, S, T): V = set(G.keys()) dist = {v: float("inf") for v in V} prev = {v: None for v in V} dist[S] =0 pq = [(0, S)] # (distance, vertex) while pq: d, u = heapq.heappop(pq) if u == T: break for v, weight in G[u].items(): new_dist = d + weight if new_dist < dist[v]: dist[v] = new_dist prev[v] = u heapq.heappush(pq, (new_dist, v)) path = [] u = T while u is not None: path.append(u) u = prev[u] return list(reversed(path)) G = { "A": {"B":2, "C":3}, "B": {"A":2, "D":1}, "C": {"A":3, "F":4}, "D": {"B":1, "E":5}, "E": {"D":5, "F":6}, "F": {"C":4, "E":6} } S = "A" T = "F" print(shortest_path(G, S, T)) # 输出:["A", "B", "D", "E", "F"]
**结论**
本文介绍了蓝桥杯上岸每日N题第二期(一)的内容,包括三道题目和对应的代码示例。这些题目涵盖了最长公共子序列、最小生成树和最短路径等多个方面。通过解决这些问题,可以提高编程能力、逻辑思维和问题解决能力。