Php 如何确定n高数字金字塔中的最大路由成本
我有一个这样的数字金字塔Php 如何确定n高数字金字塔中的最大路由成本,php,algorithm,math,Php,Algorithm,Math,我有一个这样的数字金字塔 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 (
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条路线,那么问题就有点难了
我以为我从最有力的数字开始从底部开始,但很快我意识到,最大的路线成本并不一定是以大数字开始或结束的
然后我想也许第二边界索引(你可以从一个数字中更进一步)会有帮助,但我甚至没有实现它,因为我认为它仍然使用很多资源,而且不是最优的
现在我很困惑如何重新思考这个问题。。。感谢您的任何建议我建议您仔细查看
我相信Dijkstra算法比A*更精确,但速度较慢。如果数字表示在一个图的两个节点之间旅行的成本,那么将找到最短路径。我认为,即使使用建议的Dijkstra算法,您仍然必须测试每条路径。首先,因为没有单一的起点和终点,但终点有50个起点。因此,该算法必须测试50次 因为每个选项都有两条路径,所以无法跳过其中一条。你永远不可能排除一条路,直到你走到尽头
因此,我认为没有更快的方法找到最长的路径(而不是像Dijkstra的算法那样最短的路径),然后测试所有路径。将您的金字塔视为根在金字塔顶部的树:我认为您需要从根到任何叶节点(金字塔底部)的成本最大的路径。好的,它实际上不是一棵树,因为一个节点可能有两个父节点,事实上,您最多可以从级别
i-1
的两个节点到达级别i
的节点
无论如何,我认为你可以用动态规划来计算成本最大的路线。让我以类似矩阵的方式重写您的数据:
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英镑(你有两条)。最简单的方法是自下而上,你就有了竞争力。在这种情况下,您不需要动态编程或递归。只需组成另一棵树,其中较高层数是下层数的最大值。< P>因为你可以考虑树DAG做拓扑排序,然后放松(放松到最大不min),因为它们在拓扑排序O(E+V)中。动态规划人!然而,我不完全理解你的问题,所以我不打算为你勾画DP算法。我理解你的问题有很多困难,不仅仅是因为英语。你似乎有一个图形问题,也许你应该仔细阅读,然后用图形、边和节点来陈述你的问题。Thanx,我知道图形,但不知何故我认为我可以排除它们。对不起,我的英语,我想你们会理解的:)我没有尽可能多地使用它。“每一个数字在它的行中是如何强大的索引”没有任何意义。也许用你的母语写,这样别人就可以试着翻译。A*需要一个可接受的启发,基本上是一种猜测到目标距离的方法。我认为这个问题没有解决办法。你可以采取贪婪的方法。再一次,这不是100%正确,但是在一个大的图表中会更快。干得好!除了矩阵部分,我确实写了完全相同的解决方案,但thanx是给你的时间:)动态规划是最好的!你能进一步澄清你的答案吗?也许是一个例子?@Origin你可以期望每个数字都是一个图边,因为我应该得到最大路径,而我不能回头看,金字塔原来是一个DAG,进行DFS以获得拓扑排序,然后使用它来获得图的最短路径。你可以比动态规划解决方案更快地获得它