Представьте, что у вас есть пирамида, построенная из чисел, как здесь:

Максимальная сумма последовательных чисел от верха до низа пирамиды равна 3 + 7 + 4 + 9 = 23. Ваша задача — разработать алгоритм, который находит максимальную сумму пути внутри пирамиды.

Важно: забудьте о грубой силе. Это не является целью данного упражнения.

Вот тест, который вам нужно пройти:

longest_slide_down([[3], [7, 4], [2, 4, 6], [8, 5, 9, 3]]) #23

Как решить эту задачу без грубой силы?

Можно подумать, что лучшей отправной точкой для решения этой задачи будет верхушка пирамиды. Оттуда мы найдем все возможные пути сверху вниз с соответствующими суммами. При каждой сумме останется наибольшая.

Ну, этот подход будет использовать рекурсию. Если пирамида очень длинная, будет много путей, которые могут привести в никуда. Следовательно, делая этот подход не оптимальным. Давайте рассмотрим другой подход.

Вместо того, чтобы идти сверху вниз, мы могли бы начать снизу. Мы сохраним только те пути, которые в самом низу указывают, что имеют большую сумму, чем их аналоги. Давайте посмотрим на это более четко:

Продолжим реализацию кода.

Решения

Мы будем следовать трем различным подходам к решению этой задачи. Первое решение будет интенсивно использовать память. Второй будет повторно использовать массивы, переданные в качестве аргументов, что более эффективно, чем первое решение. Наконец, мы увидим, как можно легко решить проблему с помощью метода reduce. Давайте начнем.

Первый подход

Мы начнем с массива перед последним и оттуда вычислим сумму вверх, сохраняя пути наибольшей суммы между массивами.

Второй подход

Чтобы полностью понять этот подход, давайте посмотрим, как работает .pop():

Имея это в виду, давайте перейдем к решению 2-го подхода:

Третий подход

Давайте немного рассмотрим функцию reduce(function, iterable), прежде чем переходить к решениям. Этот подход может быть самым элегантным, если мы правильно поймем концепции. Посмотрим:

Объяснив основы, давайте приступим к самому элегантному решению этой задачи кодирования: