Описание проблемы находится здесь и нажмите здесь, чтобы увидеть все другие мои решения Эйлера на F#.
Это более сложная версия задачи 82, и теперь вы можете двигаться во всех четырех направлениях!
Как и раньше, мы начинаем с загрузки входных данных в 2D-массив:
и инициализируйте другую матрицу того же размера, чтобы содержать минимальную сумму, ведущую к каждой ячейке:
Однако на этот раз мы сделали по-другому, так это выбрали начальные значения по умолчанию:
- для верхнего левого угла (0, 0) минимальная сумма сама
- для всех остальных ячеек в (row, col) мы всегда будем перемещаться вправо, а затем вниз
- если row = 0, то это равносильно движению только вправо, пока мы не достигнем col
- если col = 0, то это равнозначно перемещению вниз только до тех пор, пока мы не достигнем row
e.g.
Далее, как и для задачи 82, мы добавим пару помощников, которые помогут нам пройти по обеим матрицам:
и мы найдем новую минимальную сумму для каждой ячейки, взяв минимум из четырех направлений:
В отличие от предыдущего, мы не можем изолировать оптимизацию одного столбца за раз, и вместо этого нам нужно будет пройти всю матрицу. Для лучшей локализации кэша мы сначала пройдем по строке и рекурсивно оптимизируем всю матрицу до тех пор, пока дальнейшая оптимизация не станет невозможной:
Наконец, найдите окончательное значение для нижнего правого угла матрицы суммы:
Это решение работает на моем ноутбуке за 73 мс.
Исходный код этого решения находится здесь.