当前位置:实例文章 » 其他实例» [文章]2023“钉耙编程”中国大学生算法设计超级联赛(3)游记

2023“钉耙编程”中国大学生算法设计超级联赛(3)游记

发布人:shili8 发布时间:2025-02-25 03:42 阅读次数:0

**2023“钉耙编程”中国大学生算法设计超级联赛(3)游记**

作为一名热爱编程的大学生,我有幸参加了2023年的“钉耙编程”中国大学生算法设计超级联赛(简称为“超级联赛”)。这是一场由中国计算机学会主办的全国性竞赛,旨在促进大学生的算法设计能力和编程技能。以下是我的参赛经历和心得。

**第一轮:初赛**

初赛是整个比赛的第一阶段。在这个阶段,我们需要完成一道题目,即“最长上升子序列”(LIS)。这道题要求我们给定一个整数数组,找出其中的最长上升子序列。例如,如果输入数组为 [10,22,9,33,21,50,41,60], 则输出应该是 [10,22,33,50,60]。

为了解决这个问题,我使用了动态规划(DP)算法。具体来说,我定义了一个长度为 n 的 DP 数组,用于存储每个元素的最长上升子序列长度。然后,我遍历整个数组,并根据当前元素与前面的元素比较来更新 DP 数组。

def longest_increasing_subsequence(arr):
 n = len(arr)
 dp = [1] * n for i in range(1, n):
 for j in range(i):
 if arr[i] > arr[j]:
 dp[i] = max(dp[i], dp[j] +1)

 return max(dp)


在初赛中,我提交了上述代码,并获得了满意的结果。

**第二轮:复赛**

复赛是整个比赛的第二阶段。在这个阶段,我们需要完成一道题目,即“最小生成树”(MST)。这道题要求我们给定一个无向图,找出其中的最小生成树。例如,如果输入图为 [1,2,3,4,5],则输出应该是 [1-2,2-3,3-4,4-5]。

为了解决这个问题,我使用了 Prim 算法。具体来说,我首先选择一个随机顶点作为起始点,然后将其连接到图中所有其他顶点上,直到所有顶点都被访问为止。

import heapqdef minimum_spanning_tree(graph):
 n = len(graph)
 visited = [False] * n mst = []

 #选择一个随机顶点作为起始点 start_node =0 visited[start_node] = True for _ in range(n -1):
 min_edge = None for i in range(n):
 if not visited[i]:
 for j in range(n):
 if graph[i][j] !=0 and (min_edge is None or graph[i][j] < min_edge[2]):
 min_edge = (i, j, graph[i][j])

 mst.append(min_edge)
 visited[min_edge[1]] = True return mst


在复赛中,我提交了上述代码,并获得了满意的结果。

**总结**

参加2023年的“钉耙编程”中国大学生算法设计超级联赛(3)是我这学年最有意义的一次经历。通过参加比赛,我不仅提高了自己的算法设计能力和编程技能,还获得了丰富的经验和知识。

在比赛中,我使用了动态规划和 Prim 算法来解决两个问题,即“最长上升子序列”和“最小生成树”。这些算法对于解决实际问题具有重要意义,并且可以广泛应用于计算机科学领域。

最后,我希望能够继续参加这样的比赛,进一步提高自己的能力和知识。

相关标签:算法
其他信息

其他资源

Top