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

 

posted @ 2015-03-08 14:19  sequenceaa  阅读(172)  评论(0编辑  收藏  举报