Какой маршрут имеет самую высокую стоимость? Черепашка находится в левом верхнем углу прямоугольной таблицы размером
Какой маршрут имеет самую высокую стоимость? Черепашка находится в левом верхнем углу прямоугольной таблицы размером N×M. В каждой ячейке таблицы записано число. Черепашка может двигаться вправо или вниз, и ее маршрут заканчивается в правом нижнем углу таблицы. Нужно найти самую высокую сумму чисел, которые черепашка проходит в пути (включая начальную и конечную ячейки). Каково максимальное значение этой суммы и какой маршрут достигает этой суммы? Входные данные: первая строка содержит два натуральных числа N и M, которые не превышают...
Сквозь_Лес 34
Максимальное значение суммы и соответствующий маршрут можно найти с использованием динамического программирования.Для начала создадим прямоугольную таблицу размером N × M, где каждая ячейка будет хранить текущую максимальную сумму чисел, достигнутую черепашкой при достижении этой ячейки.
Пусть dp[i][j] будет представлять максимальную сумму чисел, достигнутую черепашкой при достижении ячейки (i, j). Тогда мы можем рассчитывать значения dp[i][j] следующим образом:
1. Для первой строка таблицы (i = 0) достижение ячейки (0, j) возможно только двигаясь вправо от предыдущей ячейки. Таким образом, dp[0][j] = dp[0][j-1] + grid[0][j], где grid[i][j] - значение, записанное в ячейке (i, j).
2. Для первого столбца таблицы (j = 0) достижение ячейки (i, 0) возможно только двигаясь вниз от предыдущей ячейки. Таким образом, dp[i][0] = dp[i-1][0] + grid[i][0].
3. Для остальных ячеек таблицы, достижение ячейки (i, j) возможно либо двигаясь вниз от предыдущей ячейки (dp[i-1][j] + grid[i][j]), либо двигаясь вправо от предыдущей ячейки (dp[i][j-1] + grid[i][j]). Выбираем путь с максимальной суммой чисел и обновляем значение dp[i][j] соответственно.
4. Максимальная сумма чисел, достигнутая черепашкой, будет храниться в ячейке dp[N-1][M-1].
Теперь рассмотрим путь, соответствующий этой максимальной сумме чисел. Мы можем его построить, следуя обратно от ячейки (N-1, M-1) к ячейке (0, 0) по следующему правилу: если значение dp[i][j] должно быть обновлено при движении вниз, значит черепашка двигалась вниз, иначе - вправо. Запоминаем каждое такое движение и получаем искомый маршрут.
Приведенный ниже код демонстрирует решение с использованием описанного алгоритма:
Эта функция может быть вызвана следующим образом:
Этот код находит максимальную сумму чисел, которую может достичь черепашка, а также выводит маршрут, соответствующий этой сумме.