Программа курса:
Разбор задачи: Уникальные пути
Предложенный нами код решения:
def uniquePaths(m, n):
"""
Вычисляет количество уникальных путей в сетке размером m x n, где робот может двигаться только вниз или вправо.
:param m: Количество строк в сетке
:param n: Количество столбцов в сетке
:return: Количество уникальных путей
"""
# Создаем матрицу для хранения количества путей
dp = [[1] * n for _ in range(m)] # Инициализация: каждая ячейка заполняется 1
# Заполняем матрицу, начиная со второй строки и второго столбца
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
return dp[m - 1][n - 1] # Возвращаем значение из правого нижнего углаРазбор решения задачи
Задача состоит в том, чтобы найти количество уникальных путей для робота, который может двигаться только вправо или вниз по сетке размера m x n, начиная с верхнего левого угла и заканчивая в правом нижнем углу.
Шаги решения
1. Инициализация матрицы dp
dp = [[1] * n for _ in range(m)]Мы создаём матрицу dp размером m x n, где каждая ячейка изначально заполнена единицей.
Зачем это нужно?
- Значение
dp[i][j]будет представлять количество путей до ячейки с координатами(i, j). - В первой строке (
dp[0][j]) и первом столбце (dp[i][0]) робот может добраться только одним способом: двигаться только вправо или только вниз. Поэтому их изначально заполняют единицами.
2. Заполнение матрицы
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]Как работает этот цикл?
- Для каждой ячейки
(i, j)значениеdp[i][j]вычисляется как сумма двух ячеек:dp[i - 1][j]— количество путей из ячейки сверху.dp[i][j - 1]— количество путей из ячейки слева.
Почему это верно?
- Если робот движется к ячейке
(i, j), он может прийти только сверху или слева. Таким образом, общее количество путей до этой ячейки — это сумма путей до ячеек сверху и слева.
Пример:
Если dp[1][2] = 3 (три пути из ячейки сверху) и dp[2][1] = 2 (два пути из ячейки слева), то общее количество путей до ячейки (2, 2) будет равно 3 + 2 = 5.
3. Результат
return dp[m - 1][n - 1]После заполнения всей матрицы значение в правом нижнем углу dp[m - 1][n - 1] будет представлять общее количество путей, ведущих в эту ячейку.
Пример выполнения
Возьмём сетку размера m = 3, n = 3.
Изначальная матрица dp:
1 1 1
1 1 1
1 1 1После выполнения алгоритма:
Для ячейки
(1, 1):dp[1][1] = dp[0][1] + dp[1][0] = 1 + 1 = 2Для ячейки
(1, 2):dp[1][2] = dp[0][2] + dp[1][1] = 1 + 2 = 3Для ячейки
(2, 1):dp[2][1] = dp[1][1] + dp[2][0] = 2 + 1 = 3Для ячейки
(2, 2):dp[2][2] = dp[1][2] + dp[2][1] = 3 + 3 = 6
Итоговая матрица dp:
1 1 1
1 2 3
1 3 6
Ответ: количество уникальных путей = 6.