Вопрос задан 25.06.2023 в 05:25. Предмет Информатика. Спрашивает Овчинников Миша.

Вывести маршрут максимальной стоимости В левом верхнем углу прямоугольной таблицы размером 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++
0 0
Перейти к ответам

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

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Азин Тимур.

Ответ:

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]))

Объяснение:

0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

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

Пример на 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; }

Этот код считывает таблицу, вычисляет максимальную сумму и маршрут, а затем выводит результат.

0 0

Похожие вопросы

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

Последние заданные вопросы в категории Информатика

Задать вопрос