假设我们有一个网格:
1 5 7
3 4 9
6 2 8
解决方案是:1-3-4-5-7-9
如何解决这个问题?
答案 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
}
我没有在算法上花费太多时间,但它就是这样的......