使用深度优先搜索的三角形最大值

时间:2016-05-03 08:56:39

标签: algorithm recursion

我有三角形的经典问题,需要获得最大路径。我被允许从(i,j)移动到(i,j-1),(i,j + 1),(i + 1,j)

示例输入

      1
    1 2 3
  1 2 3 4 5
1 2 3 4 5 6 7

最大路径是(1)+(2 + 3)+(4 + 3 + 2 + 1)+(2 + 3 + 4 + 5 + 6 + 7)的总和)。我不允许两次移动节点

我知道如何使用DP来解决这个问题但是这个问题已经在人工智能课上向我们展示了,它需要的解决方案是使用DFS / GBFS

如何使用DFS解决此问题?只有递归才出现在我脑海中,但它并不接近DFS。

我将输入表示为图形,因此对于以下

    1
  2 3 4
5 6 7 8 9

我有以下图表 1 - > {3},3 - > {2,4,7},4 - > {3,8}等

我正在考虑做一个递归函数,MaxSum(节点)并从节点1开始并做类似的事情

返回Max(MaxSum(neighbour_1),MaxSum(neighbour_2),...,MaxSum(neighbour_n))+ node

其中每个neighbour_i是未访问的邻居

但是DFS部分在哪里? 另外,我如何使用GBFS解决这个问题?

我对代码或其他东西不感兴趣,只对算法解释

1 个答案:

答案 0 :(得分:1)

  

但是DFS部分在哪里?

你拥有的图是非循环的,你试图解决的问题是longest path problem(在将节点权重转换为边权重之后)。一般解决方案要求您使用DFS查找拓扑顺序,但在您的情况下,您知道一个简单的拓扑顺序,就像您的示例中那样:

    1
  2 3 4
5 6 7 8 9

您将此订单用于第二部分 - DP解决方案。所以在某种程度上,你正在跳过DFS部分。

您可以为第一个路径显式运行DFS,它可以提供不同的拓扑顺序(取决于您如何遍历边缘),但这只是浪费精力。

同样对于第二部分,您可以逐级使用BFS来更新当前级别中元素的邻居,而不是执行DP。但是它再次没有多大意义,因为使用DP会给你相同的结果,甚至会更便宜。