poj 1088 (dfs+记忆化) 滑雪

题目;http://poj.org/problem?id=1088

感觉对深搜还不太熟练,所以练习一下,类似于连连看的那题,注意的是所求的是最大达长度,并不是从最大的或者最小的点出发得到的就是最长的路径

 1 #include<iostream>
 2 using namespace std;
 3 int dx[]={0,0,1,-1};
 4 int dy[]={1,-1,0,0};
 5 int n,m,dis[105][105];
 6 int vis[105][105];
 7 void dfs(int x,int y)
 8 {
 9     for (int i=0;i<4;i++)
10     {
11         int sx=x+dx[i];
12         int sy=y+dy[i];
13         if (sx<1||sx>n||sy<1||sy>m) continue;
14         if (dis[sx][sy]<=dis[x][y]) continue;
15         if (vis[sx][sy]>=vis[x][y]+1) continue;
16         vis[sx][sy]=vis[x][y]+1;
17         dfs(sx,sy);
18     }
19 }
20 int main()
21 {
22     int i,j;
23     cin>>n>>m;
24     for (i=1;i<=n;i++){
25         for(j=1;j<=m;j++){
26             cin>>dis[i][j];
27             vis[i][j]=1;
28         }
29     }
30     for (i=1;i<=n;i++)
31        for (j=1;j<=m;j++)
32          dfs(i,j);
33     int mx=0;
34     for (i=1;i<=n;i++)
35        for (j=1;j<=m;j++)
36            if (mx<vis[i][j]) mx=vis[i][j];
37     cout<<mx<<endl;
38     return 0;
39 }

差不多

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int dx[5]={1,-1,0,0};
 5 int dy[5]={0,0,-1,1};
 6 int n,m,vis[101][101];
 7 int hei[101][101];
 8 int dfs(int x,int y)
 9 {
10     if (vis[x][y]) return vis[x][y];
11     int ans=0;
12     for (int i=0;i<4;i++)
13     {
14         int sx=x+dx[i];
15         int sy=y+dy[i];
16         if (sx<1||sx>n||sy<1||sy>m) continue;
17         if (hei[sx][sy]>=hei[x][y]) continue;
18         vis[sx][sy]=dfs(sx,sy);
19         if (ans<vis[sx][sy])
20             ans=vis[sx][sy];
21     }
22     if (ans) return ans+1;
23     return 1;
24 }
25 int main()
26 {
27     int i,j,x,y;
28     scanf("%d %d",&n,&m);
29     int mn=100005;
30     for (i=1;i<=n;i++)
31     {
32         for (j=1;j<=m;j++)
33         {
34             scanf("%d",&hei[i][j]);
35             if (hei[i][j]<mn)
36             {
37                 x=i,y=j;
38                 mn=hei[i][j];
39             }
40         }
41     }
42     memset(vis,0,sizeof(vis));
43     vis[x][y]=1;
44     for (i=1;i<=n;i++)
45         for (j=1;j<=m;j++)
46             vis[i][j]=dfs(i,j);
47     int mx=0;
48     for (i=1;i<=n;i++)
49         for (j=1;j<=m;j++)
50            if (mx<vis[i][j]) mx=vis[i][j];
51     printf("%d
",mx);
52     return 0;
53 }
原文地址:https://www.cnblogs.com/JJCHEHEDA/p/4859468.html