我有一个像这样的数字金字塔
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路线,那么问题就更难了。
我认为我从最强大的数字开始从底部开始,但很快我才意识到,最大路线成本并非大量开始或结束。
然后我想也许是一些非常重要的索引(你可以从哪个数字中继续)会有所帮助,但是我甚至没有实现那个因为我认为它仍然使用了很多资源并且不是最优的。
现在我很困惑如何重新思考这个问题...任何建议赞赏
答案 0 :(得分:5)
将您的金字塔想象为金字塔顶部的根树:我认为您希望从根到任意叶节点(金字塔底部)的最大成本路径。好吧,它实际上不是一棵树,因为一个节点可能有两个父节点,实际上你可以从级别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(你有两个)。
答案 1 :(得分:2)
最简单的方法是自下而上,你有O(N)复杂性。这种情况下您不需要动态编程或递归。只需编写另一棵树,其中较高级别的数字是较低层数的最大值。
答案 2 :(得分:0)
我建议您查看Dijkstra's Algorithm和A*。
我相信Dijkstra比A *更准确,但速度更慢。
答案 3 :(得分:0)
如果数字代表图表中2个节点之间的成本,那么Dijkstra's algorithm将找到最短路径。
答案 4 :(得分:0)
我认为即使您使用了建议的Dijkstra算法,您仍然需要测试每条路线。首先,因为没有单一的起点和终点,但终点有50个起点。因此算法必须进行50次测试。
因为每个选项都有2条路径,所以无法跳过一条路径。你永远不能排除一条路,直到最后。
所以我不认为有更快的方法来找到最长的路径(所以不是Dijkstra算法中的最短路径)然后测试所有路线。
答案 5 :(得分:0)
你可以考虑树DAG做一个拓扑排序然后放松(放松到最大而不是最小)每个边缘,因为它们在拓扑排序O(E + V)中。