题目链接:
poj:click here.
NYOJ :click here
搜索的经典,记忆化搜索,可以用dp实现,
思路:做了一天了,关键在于记录路径的二维数组和存储图的数组,当前点四个方向都搜一遍,搜了一遍记录被访问了,高度下降才是符合要求,同时最长路径在搜的同时及时更新, 调了好几遍,搜索题目还是发现没能把图抽象化语言去实现,以后要加强,不过发现nyoj能过,同样的代码交到poj就TE了,看了一下测试数据,应该是poj的有点水了,不过数的范围大。
参考代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,m,ans,Max; int line[110][110],val[110][110];//记录路径的二维数组和存储图的数组 bool vis[110][110]; int dx[4]= {-1,1,0,0},dy[4]= {0,0,-1,1}; void dfs(int x,int y,int num) { ans=ans<num?num:ans; for(int i=0;i<4;i++) { int sx=x+dx[i]; int sy=y+dy[i]; if(sx<0||sy<0||sx>=n||sy>=m||vis[sx][sy]||val[x][y]<=val[sx][sy]) continue ; vis[sx][sy]=true ; if(line[sx][sy])//如果当前点经过路径大于零 { ans= ans<line[sx][sy]+num ? line[sx][sy]+num : ans ; vis[sx][sy]=false ; // continue ; } dfs(sx,sy,num+1); vis[sx][sy]=false; } } int main() { //freopen("1.txt","r",stdin); //freopen("2.txt","w",stdout); int i,j,T ; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=0 ; i<n ; i++) for(j=0 ; j<m ; j++) scanf("%d",&val[i][j]); memset(line,0,sizeof(line)); //开始所有点的距离都为0 Max=0; for(i=0;i<n;i++) for(j=0;j<m;j++) { ans=1; //最小距离赋为1 memset(vis,false,sizeof(vis));//全部未访问 vis[i][j]=true; //搜一次访问一次 dfs(i,j,1); //开始搜索 line[i][j]=ans; //更新路径 Max=Max<line[i][j]?line[i][j]:Max; } printf("%d\n",Max) ; } return 0 ; }