Вопрос задан 11.07.2026 в 07:41.
Предмет Информатика.
Спрашивает Рябухин Илья.
Квадрат разлинован на N×N клеток (1 < N < 17). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из двух команд: вправо или вниз. По команде вправо Робот перемещается в соседнюю правую клетку, по команде вниз – в соседнюю нижнюю. При попытке выхода за границу квадрата Робот разрушается. Перед каждым запуском Робота в каждой клетке квадрата лежит монета достоинством от 1 до 100. Посетив клетку, Робот забирает монету с собой; это также относится к начальной и конечной клетке маршрута Робота. Определите максимальную и минимальную денежную сумму, которую может собрать Робот, пройдя из левой верхней клетки в правую нижнюю. В ответе укажите два числа – сначала максимальную сумму, затем минимальную. Исходные данные представляют собой электронную таблицу размером N×N, каждая ячейка которой соответствует клетке квадрата.
Ответы на вопрос
Отвечает Мацьків Наталя.
Конкретные два числа определить нельзя: в условии отсутствуют значения монет из таблицы N×N. Ответ полностью зависит от содержимого каждой клетки.
Решение выполняется динамическим программированием. Робот может попасть в клетку (i, j) только сверху или слева, поэтому для каждой клетки достаточно хранить две величины:
-
максимальную сумму, с которой в неё можно прийти;
-
минимальную сумму, с которой в неё можно прийти.
Пусть a[i][j] — монета в клетке.
Для начальной клетки:
maxSum[0][0] = minSum[0][0] = a[0][0]
Для первой строки и первого столбца путь единственный, поэтому суммы просто накапливаются:
maxSum[0][j] = maxSum[0][j-1] + a[0][j]
minSum[0][j] = minSum[0][j-1] + a[0][j]
maxSum[i][0] = maxSum[i-1][0] + a[i][0]
minSum[i][0] = minSum[i-1][0] + a[i][0]
Для остальных клеток:
maxSum[i][j] = a[i][j] + max(maxSum[i-1][j], maxSum[i][j-1])
minSum[i][j] = a[i][j] + min(minSum[i-1][j], minSum[i][j-1])
Искомые значения находятся в правой нижней клетке:
максимальная сумма = maxSum[N-1][N-1]
минимальная сумма = minSum[N-1][N-1]
Например, на Python вычисление выглядит так:
Pythonn = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
mx = [[0] * n for _ in range(n)]
mn = [[0] * n for _ in range(n)]
mx[0][0] = mn[0][0] = a[0][0]
for j in range(1, n):
mx[0][j] = mx[0][j - 1] + a[0][j]
mn[0][j] = mn[0][j - 1] + a[0][j]
for i in range(1, n):
mx[i][0] = mx[i - 1][0] + a[i][0]
mn[i][0] = mn[i - 1][0] + a[i][0]
for i in range(1, n):
for j in range(1, n):
mx[i][j] = a[i][j] + max(mx[i - 1][j], mx[i][j - 1])
mn[i][j] = a[i][j] + min(mn[i - 1][j], mn[i][j - 1])
print(mx[n - 1][n - 1], mn[n - 1][n - 1])
Без самой электронной таблицы численный ответ указать невозможно.
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
Предметы
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili

