题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径
记忆化搜索,首先将d数组初始化为0,该点能够到达的路径长度保存在d数组中,同时把因为路径是非负的,所以如果已经计算过某个点,那么这个点的d一定是正的,所以每次搜的时候判断一下d[i][j],如果是正的,就不用再计算了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<algorithm> 6 using namespace std; 7 8 typedef long long LL; 9 int a[105][105],d[105][105],n,m; 10 int dir[4][2]={1,0,-1,0,0,1,0,-1}; 11 12 int dfs(int x,int y){ 13 if(d[x][y]) return d[x][y];//如果已经搜过这一点,则直接返回,不用再重复计算 14 int ans=0; 15 for(int i=0;i<4;i++){ //四个 方向搜 16 int nx=x+dir[i][0]; 17 int ny=y+dir[i][1]; 18 if(nx<1||nx>n||ny<1||ny>m) continue;//越界 19 if(a[x][y]>a[nx][ny]) 20 ans=max(ans,1+dfs(nx,ny)); 21 } 22 23 if(ans==0) return d[x][y]=1; 24 return d[x][y]=ans; 25 } 26 27 int main() 28 { 29 while(scanf("%d %d",&n,&m)!=EOF){ 30 for(int i=1;i<=n;i++) 31 for(int j=1;j<=m;j++) cin>>a[i][j]; 32 33 memset(d,0,sizeof(d)); 34 int tmp=0; 35 36 for(int i=1;i<=n;i++){ 37 for(int j=1;j<=m;j++) 38 tmp=max(tmp,dfs(i,j)); 39 } 40 printf("%d ",tmp); 41 } 42 return 0; 43 }