如何在网格中找到增加数字的最长路径?

时间:2014-03-06 06:35:39

标签: algorithm

假设我们有一个网格:

1 5 7
3 4 9
6 2 8

解决方案是:1-3-4-5-7-9

如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

我认为使用递归dp可以解决这个问题。只需记住从特定点开始获得的最长路径的长度。

int dp[rows][cols]={0};
int dfs(int x , int y , int val)
    {
       if(dp[i][j] != 0 ) // already visited
        return dp[i][j];
       int lengthoflongestpath = 0;
       Search in four directions in the grid for the element greater than val; // Say newx, newy,newval
       lengthoflongestpath = max(lengthoflongestpath , dfs( newx , newy , newval));
       lengthoflongestpath ++; // add that particular element to the path
       dp[x][y] = lengthoflongestpath;
       return dp[x][y];
    }


int ans = 0;   
for(i=0 to rows)
 for(j=0 to cols)
   if(dp[i][j] == 0) // unvisited
    {
     dp[i][j] = dfs(i,j,grid[i][j]);
     ans = max(ans,dp[i][j]);
    }
 PRINT ans;

返回最长路径的长度。要打印确切的路径,我们需要使用NEXT ARRAY并存储下一个返回最大“lenghtofthelongestpath”的元素。

复杂性:行* Cols

编辑:如何在4个方向搜索。

int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};

for(int i=0; i<4; i++)
 {
      int newx = x + dx[i];
      int newy = y + dy[i];
      if(newx and newy lie inside the grid and newval > val)
        dfs(newx,newy,newval);
 }

答案 1 :(得分:0)

如果您使用递归方式并且您的网格数据结构包含一个标志,告诉您是否使用了数字,那么听起来很简单。

List explore(Point start, Grid grid) {
    List result = {}
    for Point next in possible_choices(start, grid) {
        grid.markUsed(next)
        List proposed = explore(next, grid)
        if(proposed.length > result.length) result = proposed;
        else grid.markNotUsed(next)           
    }
    result.prepend(start)

    return result
}

我没有在算法上花费太多时间,但它就是这样的......