Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何确定n高数字金字塔中的最大路由成本_Php_Algorithm_Math - Fatal编程技术网

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以获得拓扑排序,然后使用它来获得图的最短路径。你可以比动态规划解决方案更快地获得它