18. Исполнитель Робот: #297263
Квадрат разлинован на $N\times N$ клеток, где $1<N<30$. Исполнитель Робот может перемещаться по клеткам, выполняя команды вправо и вниз. Между соседними клетками могут находиться внутренние стены, через которые пройти нельзя.
В каждой клетке лежит монета достоинством от $1$ до $100$. Посетив клетку, Робот забирает монету с собой, включая начальную и конечную клетки маршрута.
«Угловой» считается клетка, у которой справа и снизу находятся стены. В такой клетке Робот не может продолжить движение, поэтому накопленная сумма считается итоговой. Таких клеток может быть несколько. Требуется определить максимальную и минимальную суммы среди всех маршрутов из левой верхней клетки в одну из конечных. В ответе сначала указывается максимальная сумма, затем минимальная.
Пример входных данных:

Исходная таблица занимает диапазон $A1:T20$, поэтому $N=20$.
Вертикальные стены расположены справа от $F13:F18$, $G3:G6$, $J11:J16$, $L3:L8$, $O16:O20$, $P13:P18$, $R3:R10$.
Горизонтальные стены расположены снизу от $C2:G2$, $F8:L8$, $G10:J10$, $N10:R10$, $C12:F12$, $Q12:S12$, $L15:O15$.
Расчётную таблицу разместим справа от исходной, начиная с ячейки $V1$.
В $V1$ запишем: $=A1$
В $W1$: $=V1+B1$ и скопируем вправо до $AO1$.
В $V2$: $=V1+A2$ и скопируем вниз до $V20$.
Для поиска максимальной суммы в $W2$ запишем: $=B2+МАКС(W1;V2)$ и скопируем формулу в диапазон $W2:AO20$.
Для первых клеток:
$V1=9$,
$W1=9+23=32$,
$V2=9+28=37$,
$W2=22+\max(32;37)=59$.
После этого учитываем стены. Например, справа от стены $L3:L8$ в клетки $M3:M8$ можно попасть только сверху, поэтому в $AH3$ запишем: $=M3+AH2$ и скопируем до $AH8$.
Под стеной $F8:L8$ в клетки $F9:L9$ можно попасть только слева. В $AA9$ запишем: $=F9+Z9$ и скопируем вправо до $AG9$.
Аналогично изменяем формулы около остальных стен.
Клетка $Q13$ закрыта стенами сверху и слева, поэтому попасть в неё нельзя. Из-за вертикальной стены диапазон $Q13:Q18$ также недостижим. Для поиска максимума в соответствующий диапазон $AL13:AL18$ запишем большое отрицательное значение, например $-10^9$.
Конечными клетками являются $L8$, $R10$, $O20$ и $T20$. Максимальные суммы в них равны: $1168$, $1680$, $2009$, $1908$.
Следовательно, $\max(1168;1680;2009;1908)=2009$.
Для поиска минимальной суммы в обычных клетках используем: $=B2+МИН(W1;V2)$
Для первых клеток: $W2=22+\min(32;37)=54$.
В недостижимый диапазон $AL13:AL18$ запишем $10^9$. Формулы около стен остаются такими же.
Минимальные суммы в конечных клетках: $628$, $836$, $1090$, $1004$.
Следовательно, $\min(628;836;1090;1004)=628$.
Ответ: $2009$ $628$.
Код на Python
Если сохранить таблицу в формате CSV с именем 18-29.csv, результат можно проверить программой:
s = tuple(
tuple(map(int, row.split(';')))
for row in open('18-29.csv').read().splitlines()
)
N = len(s)
right = set()
for r1, r2, c in [
(13, 18, 6), (3, 6, 7), (11, 16, 10),
(3, 8, 12), (16, 20, 15),
(13, 18, 16), (3, 10, 18)
]:
for r in range(r1 - 1, r2):
right.add((r, c - 1))
down = set()
for r, c1, c2 in [
(2, 3, 7), (8, 6, 12), (10, 7, 10),
(10, 14, 18), (12, 3, 6),
(12, 17, 19), (15, 12, 15)
]:
for c in range(c1 - 1, c2):
down.add((r - 1, c))
mn = [[10 ** 9] * N for _ in range(N)]
mx = [[-10 ** 9] * N for _ in range(N)]
mn[0][0] = mx[0][0] = s[0][0]
for i in range(N):
for j in range(N):
if i == 0 and j == 0:
continue
a, b = [], []
if j > 0 and (i, j - 1) not in right:
if mn[i][j - 1] < 10 ** 9:
a.append(mn[i][j - 1])
b.append(mx[i][j - 1])
if i > 0 and (i - 1, j) not in down:
if mn[i - 1][j] < 10 ** 9:
a.append(mn[i - 1][j])
b.append(mx[i - 1][j])
if a:
mn[i][j] = s[i][j] + min(a)
mx[i][j] = s[i][j] + max(b)
ends = []
for i in range(N):
for j in range(N):
wall_r = j == N - 1 or (i, j) in right
wall_d = i == N - 1 or (i, j) in down
if wall_r and wall_d and mn[i][j] < 10 ** 9:
ends.append((mn[i][j], mx[i][j]))
print(max(x[1] for x in ends), min(x[0] for x in ends))
Программа выводит: $2009$ $628$.