POJ 1088 滑雪【记忆化搜索】

题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径

记忆化搜索,首先将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\n",tmp);

41     }

42     return 0;

43 }
View Code

 

你可能感兴趣的:(poj)