Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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
C 使用深度优先搜索查找具有最大值的路径_C_Complexity Theory_Graph Theory_Depth First Search_Adjacency List - Fatal编程技术网

C 使用深度优先搜索查找具有最大值的路径

C 使用深度优先搜索查找具有最大值的路径,c,complexity-theory,graph-theory,depth-first-search,adjacency-list,C,Complexity Theory,Graph Theory,Depth First Search,Adjacency List,我在解决一个我认为需要使用深度优先搜索算法的问题时遇到了一些问题 这个问题涉及到试图找到路径的最大值,但是每次你穿过这条路径时,你要么笔直走,要么向左走 以下是一个路径示例: _ |2|_ |2|1|_ |4|9|4|_ |3|2|1|2| 此路径中的最大值为2+2+9+2=15 现在谈谈问题: 我已经决定,解决这个问题的最佳方法是创建一个邻接列表,并使用带有DFS的堆栈来获得路径的最大值,但考虑到程序输入是: 4 //Number of lines 2 // First line 2 1

我在解决一个我认为需要使用深度优先搜索算法的问题时遇到了一些问题

这个问题涉及到试图找到路径的最大值,但是每次你穿过这条路径时,你要么笔直走,要么向左走

以下是一个路径示例:

 _
|2|_
|2|1|_
|4|9|4|_
|3|2|1|2|
此路径中的最大值为2+2+9+2=15

现在谈谈问题:

我已经决定,解决这个问题的最佳方法是创建一个邻接列表,并使用带有DFS的堆栈来获得路径的最大值,但考虑到程序输入是:

4 //Number of lines
2 // First line
2 1 
4 9 4 
3 2 1 2 
这是我到目前为止所拥有的

// Recieve the size of the path
scanf("%d", &nN);

// Get the amount of elements in the list: n!
for( i = 0, nFact = 0 ; i < nN ; i++ )
    nFact += nN - i;

// Create list of adjacency
list = malloc( nFat * sizeof( List ) );

// Insert elements
for( i = 0 ; i < nN ; i++ ) {
    scanf("%d", list[i].value);
    lista[i].color = 0;
    lista[i].prox = NULL;
    // No idea on how to insert the elements on their specific slot and on their adjacency, as the number keeps increasing for each line
}
//接收路径的大小
扫描频率(“%d”和&nN);
//获取列表中元素的数量:n!
对于(i=0,nFact=0;i
首先,我想问你一个问题: 为什么要使用列表?我们能用数组代替列表吗

例如,假设我们在
数组[i][j]
中:

  • 如果我们想向右移动,那么我们就在
    数组[i][j+1]
  • 如果我们想下移,我们在
    数组[i+1][j]
所以我认为我们应该使用数组来表示我们的数据结构

您了解到DFS可以解决您的问题,因此我们来看看应该做什么:

int dfs(int **array, int row, int column) {
    if (row == m || column == n) return 0;
    int res = array[row][column];
    int option_right = dfs(array, row, column + 1);
    int option_down = dfs(array, row + 1, column);
    return std::max(option_right, option_down) + res;
}
它可以解决这个问题,但我们应该注意到大(O)非常大: O(指数),我们必须做一些改进:

动态规划


如果你可以相信,除了底部可能存在的间隙之外,没有间隙,那么邻接列表似乎比它的价值要麻烦得多。只需将分数存储在数组的顺序元素中(最多需要
(nN*(nN+1))/2个
元素)。从索引
x
处的元素中,下一步的选择是索引
2*x+1
2*x+2
处的选择。同样要注意的是,尽管您当然可以使用显式堆栈数据结构,甚至可以预先知道它需要什么容量,但也可以递归地编写算法。我不相信
2*x+1
2*x+2
足以得到它们的下一步,例如:
2,2,1,4,9,4,3,2,1,2
,如果你得到第二个4,它应该指向1和2,但是如果你使用公式,它不会指向任何人。嗯,我的错。这些公式是针对二叉树的,而二叉树实际上不是你所拥有的。然而,应该有一种算术方法。也许我能解决。好吧,还不错。你只需要记录下你走的是哪一步。在第一步中,选择是
x+1
x+2
。第二,它们是
x+2
x+3
。在
n
th上,它们是
x+n
x+n+1
。您将路径的选项弄错了:从示例中,它们是(1)笔直向下,和(2)向下+向右(OP使用“左”似乎是从一个人实际沿着路径向前走的角度来看的)。不过,DP方法的扩展性要好得多,这一点您是完全正确的。写一个也很容易,因为你只需要自下而上而不是自上而下地工作。使用此代码的最大问题是,在其中一种情况下,我仍然有超时限制,即使我有另一种方式告诉我我已经通过了该路径,并返回其最大值,通过使用DP,您可以将时间复杂度降低到O(m*n),但根据John的说法,我的答案有些错误