Решение задачи #3 на Python с Яндекс CodeRun — Вывести маршрут максимальной стоимости

Опубликовано: 27.11.2024, 23:03 | Автор: hdhAI

Вариант решения задачи на языке программирования Python с Яндекс CodeRun.
Название задачи: Вывести маршрут максимальной стоимости.
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
В левом верхнем углу прямоугольной таблицы размером N×MN×M находится черепашка. В каждой клетке таблицы записано некоторое число. Черепашка может перемещаться вправо или вниз, при этом маршрут черепашки заканчивается в правом нижнем углу таблицы.

Подсчитаем сумму чисел, записанных в клетках, через которую проползла черепашка (включая начальную и конечную клетку). Найдите наибольшее возможное значение этой суммы и маршрут, на котором достигается эта сумма.

Формат ввода:
В первой строке входных данных записаны два натуральных числа N и M, не превосходящих 100 — размеры таблицы. Далее идет N строк, каждая из которых содержит M чисел, разделенных пробелами — описание таблицы. Все числа в клетках таблицы целые и могут принимать значения от 0 до 100.

Формат вывода:
Первая строка выходных данных содержит максимальную возможную сумму, вторая — маршрут, на котором достигается эта сумма. Маршрут выводится в виде последовательности, которая должна содержать N-1 букву D, означающую передвижение вниз и M-1 букву R, означающую передвижение направо. Если таких последовательностей несколько, необходимо вывести ровно одну (любую) из них.


Python

def max_turtle_path(n, m, grid):
    # Создаем массив для хранения максимальных сумм для каждой клетки
    dp = [[0] * m for _ in range(n)]
    # Создаем массив для хранения пути до каждой клетки
    path = [[None] * m for _ in range(n)]

    # Инициализируем первую клетку
    dp[0][0] = grid[0][0]

    # Заполняем первую строку (только вправо)
    for j in range(1, m):
        dp[0][j] = dp[0][j - 1] + grid[0][j]
        path[0][j] = 'R'

    # Заполняем первый столбец (только вниз)
    for i in range(1, n):
        dp[i][0] = dp[i - 1][0] + grid[i][0]
        path[i][0] = 'D'

    # Заполняем остальные клетки
    for i in range(1, n):
        for j in range(1, m):
            if dp[i - 1][j] > dp[i][j - 1]:  # Сравниваем путь сверху и слева
                dp[i][j] = dp[i - 1][j] + grid[i][j]
                path[i][j] = 'D'  # Движение вниз
            else:
                dp[i][j] = dp[i][j - 1] + grid[i][j]
                path[i][j] = 'R'  # Движение вправо

    # Восстанавливаем маршрут из path
    route = []
    i, j = n - 1, m - 1
    while i > 0 or j > 0:
        route.append(path[i][j])
        if path[i][j] == 'D':
            i -= 1
        else:  # path[i][j] == 'R'
            j -= 1

    route.reverse()  # Переворачиваем, чтобы маршрут шел от начала к концу

    # Возвращаем максимальную сумму и маршрут
    return dp[n - 1][m - 1], ''.join(route)


# Чтение входных данных
n, m = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]

# Получение результата
max_sum, route = max_turtle_path(n, m, grid)

# Вывод результата
print(max_sum)
print(route)

Объяснение кода

Входные данные:
Размеры таблицы (n, m) и сама таблица (grid) считываются из входных данных.

Динамическое программирование (DP):
Мы создаем массив dp, где dp[i][j] хранит максимальную сумму, которую можно получить, достигнув клетки (i, j).

Инициализация:
Первая клетка таблицы — это начальная позиция, её значение просто копируем в dp[0][0].
Первая строка заполняется последовательным движением вправо.
Первый столбец заполняется последовательным движением вниз.

Заполнение таблицы DP:
Для каждой клетки (i, j) выбираем максимальную сумму из двух возможных направлений: сверху (dp[i-1][j]) или слева (dp[i][j-1]), добавляя значение текущей клетки (grid[i][j]).

Восстановление пути:
Сохраняем путь до каждой клетки в массиве path.
Для восстановления маршрута начинаем с правого нижнего угла и идем к верхнему левому, используя информацию в path.

Результат:
Максимальная сумма находится в dp[n-1][m-1].
Маршрут восстанавливается из массива path и выводится в виде строки.

Источник решения: hdhAI.com