我有三角形的经典问题,需要获得最大路径。我被允许从(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解决这个问题?
我对代码或其他东西不感兴趣,只对算法解释
答案 0 :(得分:1)
但是DFS部分在哪里?
你拥有的图是非循环的,你试图解决的问题是longest path problem(在将节点权重转换为边权重之后)。一般解决方案要求您使用DFS查找拓扑顺序,但在您的情况下,您知道一个简单的拓扑顺序,就像您的示例中那样:
1
2 3 4
5 6 7 8 9
您将此订单用于第二部分 - DP解决方案。所以在某种程度上,你正在跳过DFS
部分。
您可以为第一个路径显式运行DFS,它可以提供不同的拓扑顺序(取决于您如何遍历边缘),但这只是浪费精力。
同样对于第二部分,您可以逐级使用BFS来更新当前级别中元素的邻居,而不是执行DP。但是它再次没有多大意义,因为使用DP会给你相同的结果,甚至会更便宜。