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

时间:2015-05-27 12:34:02

标签: 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 
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
}

1 个答案:

答案 0 :(得分:0)

首先,我想问你一个问题: 为什么使用列表?我们可以使用数组而不是列表吗?

例如,假设我们在array[i][j]

  • 如果我们想要向右移动,那么我们就在array[i][j+1]
  • 如果我们想要向下移动,我们就在array[i+1][j]

所以我认为我们应该使用Array来展示我们的数据结构。

你知道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(指数),我们必须做出一些改进:

动态编程

What is the difference between memoization and dynamic programming?