
Вывести маршрут максимальной стоимости В левом верхнем углу прямоугольной таблицы размером N×M
находится черепашка. В каждой клетке таблицы записано некоторое число. Черепашка может перемещаться вправо или вниз, при этом маршрут черепашки заканчивается в правом нижнем углу таблицы. Подсчитаем сумму чисел, записанных в клетках, через которую проползла черепашка (включая начальную и конечную клетку). Найдите наибольшее возможное значение этой суммы и маршрут, на котором достигается эта сумма. Входные данные В первой строке входных данных записаны два натуральных числа N и M, не превосходящих 100 — размеры таблицы. Далее идут N строк, каждая из которых содержит M чисел, разделенных пробелами — описание таблицы. Все числа в клетках таблицы целые и могут принимать значения от 0 до 100. Выходные данные Первая строка выходных данных содержит максимальную возможную сумму, вторая — маршрут, на котором достигается эта сумма. Маршрут выводится в виде последовательности, которая должна содержать N−1 букву D, означающую передвижение вниз и M−1 букву R, означающую передвижение направо. Если таких последовательностей несколько, необходимо вывести ровно одну (любую) из них. Примеры Ввод Вывод 5 5 9 9 9 9 9 3 0 0 0 0 9 9 9 9 9 6 6 6 6 8 9 9 9 9 9 74 D D R R R R D D на c++

Ответы на вопрос

Ответ:
global n,m,matrix,pathmatrix
def rec(x, y):
try:
return pathmatrix[x,y]
except:
if x > 0:
left = rec(x - 1, y)
else:
left = (-1,[])
if y > 0:
up = rec(x, y - 1)
else:
up = (-1,[])
maxdist = max(left[0], up[0]) + matrix[x][y]
if left[0] > up[0]:
path = pathmatrix[x - 1,y][1].copy()
path.append('D')
else:
path = pathmatrix[x,y - 1][1].copy()
path.append('R')
pathmatrix[x,y] = (maxdist,path)
return pathmatrix[x,y]
n,m = [int(i) for i in input().split()]
matrix = [[int(i) for i in input().split()] for j in range(n)]
pathmatrix = {(0,0) : (matrix[0][0], [])}
res = rec(n-1,m-1)
print(res[0])
print(' '.join(res[1]))
global n,m,matrix,pathmatrix
def rec(x, y):
try:
return pathmatrix[x,y]
except:
if x > 0:
left = rec(x - 1, y)
else:
left = (-1,[])
if y > 0:
up = rec(x, y - 1)
else:
up = (-1,[])
maxdist = max(left[0], up[0]) + matrix[x][y]
if left[0] > up[0]:
path = pathmatrix[x - 1,y][1].copy()
path.append('D')
else:
path = pathmatrix[x,y - 1][1].copy()
path.append('R')
pathmatrix[x,y] = (maxdist,path)
return pathmatrix[x,y]
n,m = [int(i) for i in input().split()]
matrix = [[int(i) for i in input().split()] for j in range(n)]
pathmatrix = {(0,0) : (matrix[0][0], [])}
res = rec(n-1,m-1)
print(res[0])
print(' '.join(res[1]))
Объяснение:



Для решения данной задачи можно использовать динамическое программирование. Для каждой клетки таблицы будем хранить максимальную сумму, которую можно набрать, если черепашка дошла до этой клетки. Затем, начиная с верхнего левого угла таблицы и двигаясь вправо и вниз, будем вычислять максимальные суммы для каждой клетки.
Пример на C++:
cpp#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> table(n, vector<int>(m));
vector<vector<int>> dp(n, vector<int>(m));
vector<vector<char>> path(n, vector<char>(m));
// Ввод таблицы
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> table[i][j];
}
}
// Инициализация первой строки и первого столбца
dp[0][0] = table[0][0];
for (int i = 1; i < n; i++) {
dp[i][0] = dp[i - 1][0] + table[i][0];
path[i][0] = 'D';
}
for (int j = 1; j < m; j++) {
dp[0][j] = dp[0][j - 1] + table[0][j];
path[0][j] = 'R';
}
// Заполнение dp и path
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (dp[i - 1][j] > dp[i][j - 1]) {
dp[i][j] = dp[i - 1][j] + table[i][j];
path[i][j] = 'D';
} else {
dp[i][j] = dp[i][j - 1] + table[i][j];
path[i][j] = 'R';
}
}
}
// Восстановление маршрута
int i = n - 1, j = m - 1;
string route;
while (i > 0 || j > 0) {
route += path[i][j];
if (path[i][j] == 'D') {
i--;
} else {
j--;
}
}
// Вывод максимальной суммы и маршрута
cout << dp[n - 1][m - 1] << endl;
reverse(route.begin(), route.end());
cout << route << endl;
return 0;
}
Этот код считывает таблицу, вычисляет максимальную сумму и маршрут, а затем выводит результат.


Похожие вопросы
Топ вопросов за вчера в категории Информатика








Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili