Программа курса:
Разбор задачи: Минимальная сумма пути
Предложенный нами код решения:
def minPathSum(grid):
"""
Вычисляет минимальную сумму чисел на пути из верхнего левого угла
в нижний правый угол матрицы, при движении только вправо или вниз.
:param grid: Двумерный список (матрица) неотрицательных чисел
:return: Минимальная сумма чисел на пути
"""
m, n = len(grid), len(grid[0]) # Размеры матрицы
# Обрабатываем первую строку
for j in range(1, n):
grid[0][j] += grid[0][j - 1]
# Обрабатываем первый столбец
for i in range(1, m):
grid[i][0] += grid[i - 1][0]
# Обрабатываем оставшиеся ячейки
for i in range(1, m):
for j in range(1, n):
grid[i][j] += min(grid[i - 1][j], grid[i][j - 1])
return grid[m - 1][n - 1]Шаг 1: Инициализация
m, n = len(grid), len(grid[0]) # Размеры матрицы
- Мы начинаем с того, что получаем размеры матрицы:
m— это количество строк, аn— количество столбцов. Эти данные необходимы для дальнейшего построения пути.
Шаг 2: Обработка первой строки
for j in range(1, n):
grid[0][j] += grid[0][j - 1]
- Первая строка требует особого внимания, так как перемещение может происходить только вправо.
- Для каждой ячейки во второй и следующих ячейках первой строки мы просто прибавляем к текущему значению число из предыдущей ячейки (слева), так как единственный способ попасть в ячейку — двигаться из ячейки слева. Таким образом, мы постепенно накапливаем минимальную сумму для каждой ячейки.
Шаг 3: Обработка первого столбца
for i in range(1, m):
grid[i][0] += grid[i - 1][0]
- Подобно первой строке, в первом столбце возможен только один вариант движения — вниз.
- Каждую ячейку столбца мы обновляем, прибавляя к ней число из ячейки, находящейся непосредственно выше (севернее). Это позволяет учесть минимальную сумму для движения вниз.
Шаг 4: Обработка всех остальных ячеек
for i in range(1, m):
for j in range(1, n):
grid[i][j] += min(grid[i - 1][j], grid[i][j - 1])
- Для всех остальных ячеек в матрице мы принимаем минимальную сумму из двух возможных путей:
- Из ячейки выше (
grid[i - 1][j]), если мы двигаемся вниз. - Из ячейки слева (
grid[i][j - 1]), если мы двигаемся вправо.
- Из ячейки выше (
- Каждую ячейку матрицы мы обновляем, прибавляя к ней минимальную сумму, которую мы могли бы получить, двигаясь с одного из двух возможных направлений. Этот шаг гарантирует, что на каждом шаге мы выбираем оптимальный путь.
Шаг 5: Возврат результата
return grid[m - 1][n - 1]
- После того как мы обработали все ячейки матрицы, минимальная сумма пути, приводящая к нижнему правому углу, будет храниться в ячейке
grid[m - 1][n - 1]. Мы возвращаем это значение как результат.
Пример
Для матрицы:
[[1, 3, 1],
[1, 5, 1],
[4, 2, 1]]
- Первая строка будет обновлена так:
[[1, 4, 5],
[1, 5, 1],
[4, 2, 1]]
- Первый столбец будет обновлен так:
[[1, 4, 5],
[2, 5, 1],
[6, 2, 1]]
- Остальные ячейки будут обновлены следующим образом:
[[1, 4, 5],
[2, 7, 6],
[6, 8, 7]]
- Итоговая минимальная сумма пути равна 7.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии