Квадрат разлинован на N × N клеток (1 < N< 30). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из двух команд: вправо или вниз. По команде вправо Робот перемещается в соседнюю правую клетку, по команде вниз - в соседнюю нижнюю. Квадрат ограничен внешними стенами.
Между соседними клетками квадрата также могут быть внутренние стены. Сквозь стену Робот пройти не может.
Перед каждым запуском Робота в каждой клетке квадрата лежит монета достоинством от 1 до 100. Посетив клетку, Робот забирает монету с собой; это также относится к начальной и конечной клеткам маршрута Робота.
В «угловых» клетках поля - тех, которые справа и снизу ограничены стенами, Робот не может продолжать движение, поэтому накопленная сумма считается итоговой.
Таких конечных клеток на поле может быть несколько, включая правую нижнюю клетку поля. При разных запусках итоговые накопленные суммы могут различаться.
Определите максимальную и минимальную денежные суммы среди всех возможных итоговых сумм, которые может собрать Робот, пройдя из левой верхней клетки в конечную клетку маршрута.
В ответе укажите два числа (через пробел) - сначала максимальную сумму, затем минимальную.
Исходные данные представляют собой электронную таблицу размером N × N, каждая ячейка которой соответствует клетке квадрата. Внутренние и внешние стены обозначены утолщенными линиями.
Пример входных данных
Ответ для примера входных данных: 41 27
Давайте разберемся подробно с задачей и решим ее шаг за шагом.
### Условие задачи:
- У нас есть квадрат размером N×N (где 1 < N < 30).
- В каждой клетке находится монета с достоинством от 1 до 100, которую Робот собирает при посещении.
- Робот начинает движение из левой верхней клетки (0,0).
- Он может перемещаться только вправо или вниз.
- Между клетками могут быть внутренние стены, которые блокируют проход.
- Внешние стены ограничивают поле.
- Конечных клеток (терминальных) — такие, в которые нельзя двигаться дальше из-за стен.
- Нужно найти **максимальную** и **минимальную** сумму монет, которую можно заработать, пройдя от стартовой точки до любого из возможных конечных клеток.
### Что нужно сделать:
1. **Обойти всю возможную маршрутизацию по полю**.
2. **На каждом шаге выбрать маршрут с максимальной и минимальной суммой**, учитывая, что есть ограничения по стенам.
3. В конце — найти максимум и минимум среди всех доступных конечных путей.
---
## Шаги решения:
### Шаг 1. Представление данных:
- Ввод — таблица N×N, где для каждой клетки указано достоинство монеты.
- Внутренние стены и внешние стены можно представить с помощью дополнительной структуры, например, двух массивов — по горизонтали и вертикали линий, указывающих наличие стен.
### Шаг 2. Обработка данных:
- На входе у нас есть рисунок или таблица, которая показывает расположение стен.
- Нужно создать двумерные массивы:
- `coins[i][j]` — достоинство монеты в клетке.
- `walls_horizontal[i][j]` — есть ли стена справа от клетки `(i,j)`.
- `walls_vertical[i][j]` — есть ли стена снизу от клетки `(i,j)`.
### Шаг 3. Алгоритм поиска маршрутов:
Используем динамическое программирование:
- `dp_max[i][j]` — максимальная сумма монет, когда мы достигли клетки `(i,j)`.
- `dp_min[i][j]` — минимальная сумма монет при достижении `(i,j)`.
Для стартовой клетки:
```
dp_max[0][0] = coins[0][0]
dp_min[0][0] = coins[0][0]
```
Для остальных клеток:
- Проверяем возможность пройти слева (`(i, j-1)`) — если между `(i,j-1)` и `(i,j)` нет стены справа.
- Проверяем возможность пройти сверху (`(i-1, j)`) — если между `(i-1, j)` и `(i,j)` нет стены снизу.
Обновляем значения:
```
dp_max[i][j] = coins[i][j] + max(если возможно, dp_max из соседних клеток)
dp_min[i][j] = coins[i][j] + min(если возможно, dp_min из соседних клеток)
```
Если клетка недоступна (заблокирована стенами или не существует путей), ее значения остаются недопустимыми.
### Шаг 4. Нахождение ответов:
- После заполнения таблиц — рассматриваем все клетки, которые не имеют продолжения из-за стен или ограничений.
- Среди них ищем максимальное и минимальное значения `dp_max[i][j]` и `dp_min[i][j]`.
---
## Итог:
- Максимальный сбор монет — максимум по `dp_max`.
- Минимальный сбор — минимум по `dp_min`.
---
## Вопрос по примеру и финальный ответ:
Вы указали, что пример входных данных приводит к ответу `41 27`.
---
## Обратите внимание:
- В реальной задаче потребуется правильно интерпретировать входные данные, расположение стен и заполнять массивы.
- После этого реализовать descriminative DP.
---
Если вы пришлете конкретные входные данные или изображение поля, можно помочь написать код или провести расчет вручную.
---
Если есть дополнительные данные или нужно конкретное решение — сообщите!