Предположим, что у меня есть матрица m x n
в Java.
Я хочу найти максимальную стоимость обхода от первого столбца до последнего столбца. Каждое значение представляет собой понесенные затраты. Мне разрешено путешествовать вверх, вниз и вправо по матрице. Каждую ячейку можно посещать только один раз. Переходы допускаются из верхней ячейки столбца в нижней части того же и наоборот.
Для простоты рассмотрим следующую матрицу:
2 3 17
4 1 -1
5 0 14
Если я должен найти максимальную стоимость, мой ответ будет 46 (2 → 5 → 4 → 1 → 3 → 0 → 14 → 17).
Я попытался решить эту проблему с помощью динамического подхода, используя следующее рекурсивное отношение:
maxCost(of destination node) = max{ maxCost(at neighbouring node 1), maxCost(at neighbouring node 2), maxCost(at neighbouring node 3) } + cost(of destination node)
В этом случае это будет что-то вроде:
maxCost(17) = max{ maxCost(3), maxCost(-1), maxCost(14) } + 17;
Так как каждую ячейку разрешено посещать только один раз, я понимаю, что мне нужно будет поддерживать соответствующую матрицу m x n
isVisited
. Однако я не могу понять, как поддерживать матрицу isVisited
. Матрица будет изменена при вычислении maxCost (3); но для maxCost (-1) и maxCost (14) мне потребуется его первоначальный статус (который будет потерян).
Подходит ли мой подход к этой проблеме? Кроме того, я не могу понять, как должны выглядеть мои функции. (Это моя первая попытка динамического программирования).