Разбор задачи: Уникальные пути

Предложенный нами код решения:

 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, 1):

    dp[1][1] = dp[0][1] + dp[1][0] = 1 + 1 = 2
    
  2. Для ячейки (1, 2):

    dp[1][2] = dp[0][2] + dp[1][1] = 1 + 2 = 3
    
  3. Для ячейки (2, 1):

    dp[2][1] = dp[1][1] + dp[2][0] = 2 + 1 = 3
    
  4. Для ячейки (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.


 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии