Соревновательное программирование: примеры и методы кода Python

Вот несколько методов, обычно используемых в соревновательном программировании, с примерами кода:

  1. Грубая сила.
    Грубая сила предполагает перебор всех возможных решений и выбор лучшего. Этот подход подходит для входных данных небольшого размера.

    def brute_force(nums):
       max_sum = float('-inf')
       for i in range(len(nums)):
           for j in range(i, len(nums)):
               curr_sum = sum(nums[i:j+1])
               max_sum = max(max_sum, curr_sum)
       return max_sum
  2. Двоичный поиск.
    Двоичный поиск – это эффективный алгоритм поиска определенного значения в отсортированном списке или массиве.

    def binary_search(nums, target):
       low, high = 0, len(nums) - 1
       while low <= high:
           mid = (low + high) // 2
           if nums[mid] == target:
               return mid
           elif nums[mid] < target:
               low = mid + 1
           else:
               high = mid - 1
       return -1
  3. Динамическое программирование.
    Динамическое программирование разбивает сложную задачу на более мелкие перекрывающиеся подзадачи и решает их итеративно, сохраняя результаты во избежание повторных вычислений.

    def fibonacci(n):
       if n <= 1:
           return n
       dp = [0] * (n + 1)
       dp[1] = 1
       for i in range(2, n + 1):
           dp[i] = dp[i - 1] + dp[i - 2]
       return dp[n]
  4. Поиск в глубину (DFS).
    DFS — это алгоритм обхода, который исследует как можно дальше вдоль каждой ветви перед возвратом.

    def dfs(graph, start):
       visited = set()
       stack = [start]
       while stack:
           vertex = stack.pop()
           if vertex not in visited:
               visited.add(vertex)
               stack.extend(graph[vertex] - visited)
       return visited
  5. Поиск в ширину (BFS):
    BFS — это алгоритм обхода, который исследует все вершины графа в порядке ширины, посещая всех соседей перед переходом на следующий уровень.

    from collections import deque
    
    def bfs(graph, start):
       visited = set()
       queue = deque([start])
       while queue:
           vertex = queue.popleft()
           if vertex not in visited:
               visited.add(vertex)
               queue.extend(graph[vertex] - visited)
       return visited