Максимальная сумма путей от левого верхнего угла к правому нижнему матрице, проходящей через одну из заданных ячеек

Опубликовано: 22 Сентября, 2022

По заданной матрице mat[][] размерности N * M и набору координат ячеек [][] размера Q задача состоит в том, чтобы найти максимальную сумму пути из верхней левой ячейки (1, 1 ) в нижнюю правую ячейку (N, M) , так что путь должен содержать хотя бы одну из координат из массива координат[][2] . Из любой ячейки (i, j) матрицы разрешены только ходы (i + 1, j) или (i, j + 1) .

Примеры:

Input: mat[][  = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, coordinates[][] = {{1, 2}, {2, 2}}
Output: 27
Explanation:
The path having the maximum is given by:
(1, 1) -> (2, 1) -> (2, 2) -> (3, 2) -> (3, 3).
The above path passes through the coordinates (2, 2). Therefore, the sum of the path is given by (1 + 4 + 5 + 8 + 9) = 27, which is maximum path.

Input: mat[][] = {{1, 3}, {6, 7}, {8, 9}} , coordinates[][2] = {{1, 1}}
Output: 24
 

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

Временная сложность: O((N + M)!)
Вспомогательное пространство: O(1)

Эффективный подход. Описанный выше подход также можно оптимизировать с помощью динамического программирования. Рассмотрим две матрицы start[][] и end[][] такие, что start[i][j] обозначает максимальную сумму путей из ячейки (1, 1) в ячейку (i, j) и end[i] [j] обозначает максимальную сумму путей из ячейки (i, j) в ячейку (N, M) . Следовательно, для любой координаты (X, Y) максимальная сумма пути может быть рассчитана как:

start[X][Y] + end[X][Y] – mat[X][Y]

Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте две матрицы, скажем, start[][] и end[][] размерностей N*M так, чтобы start[i][j] обозначал максимальную сумму путей из ячейки (1, 1) в ячейку (i, j ) и end[i][j] обозначает максимальную сумму путей из ячейки (i, j) в ячейку (N, M) .
  • Инициализируйте переменную, скажем, как INT_MIN , которая хранит результирующую максимальную сумму.
  • Вычислите максимальную сумму пути от ячейки (1, 1) до каждой ячейки (i, j), используя подход «снизу вверх», обсуждаемый в этой статье, и сохраните ее в матрице start[][] .
  • Вычислите максимальную сумму путей от ячейки (N, M) до каждой ячейки (i, j), используя нисходящий подход, обсуждаемый в этой статье, и сохраните ее в матрице end[][] .
  • Перейдите координаты массива[][] и для каждой координаты (X, Y) обновите значение ans как максимальное значение ans and (start[X][Y] + end[X][Y] – mat[X][ Й]) .
  • После выполнения вышеуказанных шагов выведите значение ans как результирующую максимальную сумму.

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(N * M)
Вспомогательное пространство: O(N * M)