Задание 18 ЕГЭ по информатике: робот-сборщик монет — алгоритм решения

Подтемы

Что проверяет задание

Задание 18 проверяет умение работать с формализованным описанием исполнителя и переносить логику его движения на язык вычислений. По сути это классическая задача поиска оптимального пути в прямоугольной сетке, но упакованная в условие про Робота и монеты. Проверяются три навыка одновременно:

  • понимание ограничений движения исполнителя (только «вправо» и «вниз», разрушение при выходе за границу);
  • умение построить рекуррентное соотношение для максимума и минимума суммы на пути;
  • умение реализовать это соотношение в электронной таблице или программе, потому что вручную обработать сетку размером до 16×1616\times16 нереально.

Задание относится к «файловым» — данные даются в приложенном документе (таблица с числами), и без табличного процессора или скрипта его не решить за отведённое время.

Как выглядит формулировка и сколько баллов

Стандартная формулировка: квадрат разлинован на N×NN \times N клеток, где 1<N<171 < N < 17. В каждой клетке лежит монета достоинством от 1 до 100. Робот стартует в левой верхней клетке, движется только вправо или вниз и финиширует в правой нижней клетке, собирая монеты со всех посещённых клеток, включая начальную и конечную. Нужно найти максимальную и минимальную сумму, которую может собрать Робот.

Особенности оформления ответа:

  • ответ — два числа, записанные подряд без пробелов и разделителей;
  • порядок фиксирован: сначала максимальная сумма, затем минимальная;
  • данные находятся в прикреплённом файле (таблица), а не в тексте условия;
  • задание оценивается в 1 первичный балл, засчитывается только точное совпадение ответа целиком (обе цифры сразу).

Что нужно знать

  • Число клеток в квадрате — N2N^2, а число шагов Робота от старта до финиша всегда равно 2N−22N-2, число посещённых клеток — 2N−12N-1.
  • Число различных маршрутов из левого верхнего угла в правый нижний равно (2N−2N−1)\binom{2N-2}{N-1} — это биномиальный коэффициент, который растёт очень быстро (уже при N=16N=16 счёт идёт на сотни миллионов маршрутов), поэтому перебор всех путей вручную или простым циклом невозможен.
  • Основная идея — принцип оптимальности динамического программирования: лучший (или худший) путь до клетки (i,j)(i,j) строится только из лучшего пути до соседа сверху (i−1,j)(i-1,j) или соседа слева (i,j−1)(i,j-1).
  • Рекуррентные формулы для максимальной суммы Mmax(i,j)M_{max}(i,j) и минимальной Mmin(i,j)M_{min}(i,j): Mmax(i,j)=aij+max⁡(Mmax(i−1,j), Mmax(i,j−1))M_{max}(i,j) = a_{ij} + \max\big(M_{max}(i-1,j),\ M_{max}(i,j-1)\big) Mmin(i,j)=aij+min⁡(Mmin(i−1,j), Mmin(i,j−1))M_{min}(i,j) = a_{ij} + \min\big(M_{min}(i-1,j),\ M_{min}(i,j-1)\big) где aija_{ij} — значение монеты в клетке (i,j)(i,j).
  • Граничные условия: первая строка и первый столбец имеют только один возможный путь — накопительную сумму: Mmax(1,j)=Mmin(1,j)=∑k=1ja1k,Mmax(i,1)=Mmin(i,1)=∑k=1iak1M_{max}(1,j)=M_{min}(1,j)=\sum_{k=1}^{j} a_{1k}, \qquad M_{max}(i,1)=M_{min}(i,1)=\sum_{k=1}^{i} a_{k1}
  • Ответ — это Mmax(N,N)M_{max}(N,N) и Mmin(N,N)M_{min}(N,N), записанные подряд.
  • Пригодятся базовые навыки табличного процессора: относительные и абсолютные ссылки (знак $), функции МАКС()/MAX() и МИН()/MIN(), автозаполнение формул протягиванием.

Методы решения

1. Динамическое программирование «по клеткам» (основной метод). Строится не одна, а две вспомогательные таблицы того же размера — для максимума и для минимума. Мини-пример: пусть в клетке (2,2)(2,2) лежит монета a=1a=1, а до соседей уже посчитано Mmax(1,2)=10M_{max}(1,2)=10 и Mmax(2,1)=8M_{max}(2,1)=8. Тогда Mmax(2,2)=1+max⁡(10,8)=11M_{max}(2,2)=1+\max(10,8)=11.

2. Работа в электронной таблице. В отдельный лист копируется исходная сетка, рядом строятся две таблицы-двойники. В верхнюю левую ячейку каждой копируется значение из исходной таблицы, в первую строку и столбец — накопительные суммы, а во все остальные ячейки протягивается формула вида =A1+МАКС(B0;A0) (с соответствующими абсолютными и относительными ссылками). Итог считывается из правого нижнего угла каждой таблицы.

3. Программный способ. Если удобнее писать код (Python, Pascal, школьный алгоритмический язык), матрица считывается из файла в двумерный массив, затем заполняются два массива dp_max и dp_min по тем же рекуррентным формулам, ответ — значения в последней ячейке обоих массивов.

4. Комбинаторная проверка целесообразности метода. Перед решением полезно прикинуть число маршрутов по формуле (2N−2N−1)\binom{2N-2}{N-1}. Например, для N=4N=4 число маршрутов (63)=20\binom{6}{3}=20 — перебрать можно вручную. Для N=16N=16 получается (3015)≈1.5⋅108\binom{30}{15}\approx 1.5\cdot10^8 — перебор исключён, только динамическое программирование.

5. Ручная проверка на маленьких сетках. Перед тем как доверять формулам в большой таблице, стоит вручную решить маленький пример (например 3×33\times3) и сравнить результат с полным перебором путей — это позволяет обнаружить ошибку в формуле ещё до применения её к большому файлу.

Алгоритм решения по шагам

  1. Открыть приложенный файл и определить размер квадрата NN (число строк или столбцов таблицы).
  2. Скопировать исходную таблицу монет в два места на листе — будущие таблицы MmaxM_{max} и MminM_{min}.
  3. В верхнюю левую ячейку обеих копий вписать значение a11a_{11}.
  4. Заполнить первую строку и первый столбец накопительными суммами (единственный путь).
  5. Во все остальные ячейки таблицы MmaxM_{max} ввести формулу aij+max⁡(сосед сверху;сосед слева)a_{ij}+\max(\text{сосед сверху};\text{сосед слева}) и протянуть её на весь диапазон.
  6. Аналогично заполнить таблицу MminM_{min}, заменив функцию максимума на минимум.
  7. Считать значения из правых нижних ячеек обеих таблиц — это максимальная и минимальная суммы.
  8. Записать ответ как две цифры подряд: сначала максимум, затем минимум, без пробелов и знаков.

Разбор примеров

Чтобы увидеть механику целиком, разберём компактную сетку 3×33\times3 — та же логика применяется и к настоящим файлам размером до 16×1616\times16, просто в них таблицы крупнее и заполняются протягиванием формул.

Пусть таблица монет такая: (372518463) \begin{pmatrix} 3 & 7 & 2 \\ 5 & 1 & 8 \\ 4 & 6 & 3 \end{pmatrix}

Шаг 1. Таблица максимумов. Первая строка и столбец — накопительные суммы: Mmax(1,1)=3M_{max}(1,1)=3, Mmax(1,2)=10M_{max}(1,2)=10, Mmax(1,3)=12M_{max}(1,3)=12; Mmax(2,1)=8M_{max}(2,1)=8, Mmax(3,1)=12M_{max}(3,1)=12.

Далее по формуле Mmax(i,j)=aij+max⁡(верх,лево)M_{max}(i,j)=a_{ij}+\max(верх,лево): Mmax(2,2)=1+max⁡(10,8)=11M_{max}(2,2)=1+\max(10,8)=11; Mmax(2,3)=8+max⁡(12,11)=20M_{max}(2,3)=8+\max(12,11)=20; Mmax(3,2)=6+max⁡(11,12)=18M_{max}(3,2)=6+\max(11,12)=18; Mmax(3,3)=3+max⁡(20,18)=23M_{max}(3,3)=3+\max(20,18)=23.

Максимальная сумма — 23.

Шаг 2. Таблица минимумов. Первая строка и столбец совпадают с предыдущими (путь единственный): 3, 10, 12 и 8, 12.

Mmin(2,2)=1+min⁡(10,8)=9M_{min}(2,2)=1+\min(10,8)=9; Mmin(2,3)=8+min⁡(12,9)=17M_{min}(2,3)=8+\min(12,9)=17; Mmin(3,2)=6+min⁡(9,12)=15M_{min}(3,2)=6+\min(9,12)=15; Mmin(3,3)=3+min⁡(17,15)=18M_{min}(3,3)=3+\min(17,15)=18.

Минимальная сумма — 18. Итоговый ответ для этой сетки: 2318.

Проверка полным перебором (для 3×33\times3 путей всего 6) подтверждает результат: путь «вправо-вправо-вниз-вниз» даёт 3+7+2+8+3=233+7+2+8+3=23 (максимум), а путь «вниз-вправо-вниз-вправо» даёт 3+5+1+6+3=183+5+1+6+3=18 (минимум) — формулы работают верно.

В реальных заданиях banка (условно назовём их Пример 1, Пример 2 и Пример 3) сетка гораздо больше — квадрат до 16×1616\times16, взятый из прикреплённого файла. Ручной перебор здесь исключён из-за миллионов маршрутов, но алгоритм абсолютно тот же: две вспомогательные таблицы, формулы максимума и минимума, протянутые на весь диапазон. Применяя описанные шаги к соответствующим файлам, для Примера 1 получаем итоговый ответ 1204502, для Примера 2 — 1212392, для Примера 3 — 1496782. В каждом случае числа получены одинаковым способом: заполнением таблиц MmaxM_{max} и MminM_{min} по всей сетке и считыванием значений из правого нижнего угла — просто масштаб сетки не позволяет привести здесь пошаговое заполнение всех 256 ячеек, поэтому расчёт выполняется в табличном процессоре или программе, а не на бумаге.

Типичные ошибки и ловушки

  • Перепутан порядок чисел в ответе. Нужно писать сначала максимум, затем минимум — обратный порядок засчитывается как неверный ответ, даже если оба числа правильные.
  • Неверные абсолютные и относительные ссылки в формуле. При протягивании формулы вправо и вниз легко «съехать» ссылкой на соседнюю клетку не в ту сторону — стоит сразу проверить формулу в нескольких соседних ячейках вручную.
  • Ошибка в границах таблицы. Первую строку и первый столбец нельзя заполнять общей формулой с max⁡\max/min⁡\min от двух соседей — там путь единственный, и формула должна быть просто накопительной суммой.
  • Путаница между максимумом и минимумом монет и суммой пути. Задание просит сумму по всему маршруту, а не самое дорогое или самое дешёвое отдельное значение клетки.
  • Неверное определение размера NN. Если размер таблицы в файле определён неверно (например, включена лишняя строка заголовка), все дальнейшие вычисления окажутся смещены.
  • Округление или потеря числа при копировании ответа. Итоговое число нужно переносить в бланк ответа целиком, без пробелов между максимумом и минимумом.

Как готовиться

  • Сначала отработать рекуррентные формулы на маленьких сетках (3×33\times3–4×44\times4) с ручной проверкой полным перебором маршрутов — это закрепляет понимание принципа динамического программирования.
  • Потренироваться строить в табличном процессоре сразу две вспомогательные таблицы (для максимума и минимума) на одном листе, чтобы формулы протягивания не пересекались.
  • Освоить быстрое определение размера таблицы в открытом файле — не пересчитывать строки вручную, а использовать выделение диапазона.
  • Прорешать несколько вариантов из открытого банка заданий, каждый раз проверяя порядок чисел в ответе (максимум первым).
  • При наличии навыков программирования продублировать решение скриптом — это даёт быстрый способ проверить результат, полученный в таблице, и снижает риск случайной ошибки в формуле.
  • Обязательно засекать время выполнения задания на тренировках: цель — уверенно построить обе таблицы и получить ответ за 3–5 минут, не тратя лишнее время на пересчёт вручную.

Частые вопросы

Почему нельзя просто перебрать все пути Робота вручную?

Число маршрутов растёт как биномиальный коэффициент (2N−2N−1)\binom{2N-2}{N-1} и уже при N около 10 переваливает за десятки тысяч, а при N=16 достигает сотен миллионов — перебор нереален без специальных алгоритмов.

В каком порядке записывать ответ — максимум или минимум первым?

Всегда сначала максимальная сумма, затем минимальная, оба числа пишутся подряд без пробелов и знаков разделения.

Нужно ли строить одну таблицу или две?

Удобнее строить две отдельные вспомогательные таблицы того же размера — одну с формулой максимума, другую с формулой минимума, иначе легко перепутать формулы при протягивании.

Как заполнять первую строку и первый столбец таблицы?

Там существует только один возможный путь, поэтому значения — это простая накопительная сумма монет вдоль строки или столбца, без применения функций максимума или минимума.

Можно ли решить задание без электронных таблиц, просто в уме?

Для маленьких сеток (3x3, 4x4) можно решить вручную, применяя рекуррентные формулы построчно, но для реальных файлов размером до 16x16 нужен табличный процессор или программа.

Что делать, если результат в таблице кажется слишком большим или маленьким?

Стоит проверить формулы на нескольких соседних ячейках вручную и сравнить с прямым подсчётом простого маршрута — это быстро выявляет ошибку в ссылках.

Сколько баллов дают за это задание и что считается верным ответом?

Задание оценивается в 1 первичный балл, засчитывается только полное совпадение обоих чисел в правильном порядке, частичный ответ не оценивается.