как определить максимальную стоимость маршрута в N высокой числовой пирамиде

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

       7
      4 8
     1 8 9
    2 4 6 7
   4 6 7 4 9
  4 9 7 3 8 8

routes: 32

каждое число индексируется по тому, насколько мощным в его линии.

 0 ( 9 => 1 ) 1 ( 8 => 5 ) 2 ( 8 => 4 ) 3 ( 7 => 2 ) 4 ( 4 => 0 ) 5 ( 3 => 3 )
 0 ( 9 => 4 ) 1 ( 7 => 2 ) 2 ( 6 => 1 ) 3 ( 4 => 3 ) 4 ( 4 => 0 )
 0 ( 7 => 3 ) 1 ( 6 => 2 ) 2 ( 4 => 1 ) 3 ( 2 => 0 )
 0 ( 9 => 2 ) 1 ( 8 => 1 ) 2 ( 1 => 0 )
 0 ( 8 => 1 ) 1 ( 4 => 0 )
 0 ( 7 => 0 )

в этой пирамиде есть 2^(n-1) маршрута (вы можете пройти 2 пути из каждого числа) Если пирамида высокая такая низкая, то легко можно рассчитать все маршруты, и сравнить друг с другом. Но если у вас есть 50 высоких пирамид с 562949953421312 маршрутами, проблема немного сложнее.

Я thoght я начинаю снизу, начиная с самые мощные числа, но вскоре я понял, что максимальная стоимость маршрута не обязательно начинается или заканчивается большими числами.

тогда я подумал, что, возможно, secoundary indexes (где вы можете пойти дальше от числа) поможет, но я даже не реализовал это, потому что я предполагал, что он все еще использует много ресурсов и не оптимален.

и теперь я запутался как перезапустить думать об этой проблеме... любые советы оценили

6 ответов


подумайте о своей пирамиде как о дереве с корнем на вершине пирамиды: я думаю, вам нужен маршрут с максимальной стоимостью от корня до любого из узлов листа (внизу пирамиды). ОК, это на самом деле не дерево, потому что узел может иметь двух родителей, на самом деле вы можете добраться до узла на уровне i из более двух узлов на уровне i-1.

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

7 
4 8 
1 8 9 
2 4 6 7 
4 6 7 4 9 
4 9 7 3 8 8

и пусть отсутствующие элементы матрицы равны 0. Назовем эту матрицу v (значения). Теперь вы можете построить матрицу c (расходов), где c(i,j) - максимальная стоимость достижения узла дерева в позиции (i,j). Вы можете вычислить его с помощью этого повторения:

c(i,j) = v(i,j) + max{ c(i-1,j-1), c(i-1,j) }

здесь c(h,k) равно 0, когда вы попадаете в позицию из Матрицы. По существу, мы говорим, что максимальная стоимость для получения узла на позиция (i,j) это стоимость самого узла плюс максимум между затратами на получение его двух возможных родителей на уровне i-1.

здесь c для примера:

7     
11 15    
12 23 24   
14 27 30 31  
18 33 37 35 40 
22 42 44 40 48 48

например, возьмем i=3, j=2:

c(3,2) = v(3,2) + max{ c(2,1), c(2,2) }
       = 6      + max{ 23    , 24     }
       = 30

С c вы видите, что самый дорогой маршрут стоит 48 (и у вас их два).


самый простой способ - идти снизу вверх, и у вас есть O (N) compexity. В этом случае вам не нужно динамическое программирование и рекурсия. Просто составьте другое дерево, где число на более высоком уровне-это максимум чисел нижнего слоя.


Я предлагаю вам посмотреть алгоритм Дейкстры и A*.

Я считаю, что Dijkstra является более точным, чем*, но медленнее.


Если числа представляют стоимость перемещения между 2 узлами графика, то алгоритм Дейкстры найдет кратчайший путь.


Я думаю, что даже если вы используете предложенный алгоритм Дейкстры, вы все равно должны проверить каждый маршрут. Прежде всего потому, что нет одной начальной и конечной точки, но есть 50 начальных точек для конечной точки. Таким образом, алгоритм должен быть протестирован 50 раз.

и поскольку каждый параметр имеет 2 пути, нет возможности пропустить один. Вы никогда не сможете исключить путь, пока не окажетесь в самом конце.

поэтому я не думаю, что есть более быстрый способ найти самый длинный путь (так что не самый короткий, как в алгоритме Дейкстры), чтобы проверить все маршруты.


Как вы можете считать дерево DAG сделать топологическую сортировку, то расслабьтесь(расслабьтесь до максимума не мин) каждый край, как они находятся в топологической сортировке O (E+V) .