1280:【例9.24】滑雪

滑雪

深搜复杂度还是高了点。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=105;
 6 int r,c,maxx,a[N][N],t[]={-1,1,0,0,0,0,-1,1};
 7 void dfs(int x,int y,int d){
 8     for(int i=0;i<4;i++){
 9         int nx=x+t[i],ny=y+t[i+4];
10         if(nx>0&&nx<=r&&ny>0&&ny<=c&&a[nx][ny]>a[x][y]){
11             dfs(nx,ny,d+1);
12         }
13     }
14     if(d>maxx)maxx=d;
15 }
16 int main(){
17     cin>>r>>c;
18     for(int i=1;i<=r;i++)
19         for(int j=1;j<=c;j++)
20             scanf("%d",&a[i][j]);
21     for(int i=1;i<=r;i++)
22         for(int j=1;j<=c;j++)
23             dfs(i,j,1);
24     cout<<maxx;
25     return 0;
26 }

 广搜复杂度也还是高了点。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N=105;
 8 int r,c,maxx,a[N][N],f[N][N],t[]={-1,1,0,0,0,0,-1,1};
 9 queue<int> q;
10 
11 void bfs(){
12     while(!q.empty()){
13         int x=q.front();
14         q.pop();
15         int y=q.front();
16         q.pop();
17         for(int i=0;i<4;i++){
18             int nx=x+t[i],ny=y+t[i+4];
19             if(nx>0&&nx<=r&&ny>0&&ny<=c&&a[nx][ny]>a[x][y]&&f[nx][ny]<f[x][y]+1){
20                 q.push(nx),q.push(ny);
21                 f[nx][ny]=f[x][y]+1;
22             }
23         }
24         maxx=max(maxx,f[x][y]+1);
25     }
26 }
27 int main(){
28     cin>>r>>c;
29     for(int i=1;i<=r;i++)
30         for(int j=1;j<=c;j++)
31             scanf("%d",&a[i][j]);
32     for(int i=1;i<=r;i++)
33         for(int j=1;j<=c;j++){
34             memset(f,0,sizeof(f));
35             q.push(i),q.push(j);
36             bfs();
37         }
38     cout<<maxx;
39     return 0;
40 }

将深搜剪枝,进行记忆化搜索。

可得到可行的答案。

因为是记忆化搜索,所以也有点dp的味道,放在dp这个版块好像也没有什么问题。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=105;
 6 int r,c,maxx,a[N][N],f[N][N],t[]={-1,1,0,0,0,0,-1,1};
 7 void dfs(int x,int y){
 8     if(f[x][y]>0)return;//f[x][y]表示滑到(x,y)的最长距离
 9     f[x][y]=1;
10     for(int i=0;i<4;i++){
11         int nx=x+t[i],ny=y+t[i+4];
12         if(nx>0&&nx<=r&&ny>0&&ny<=c&&a[nx][ny]>a[x][y]){
13             dfs(nx,ny);
14             f[x][y]=max(f[x][y],f[nx][ny]+1);
15         }
16     }
17     maxx=max(maxx,f[x][y]);
18 }
19 int main(){
20     cin>>r>>c;
21     for(int i=1;i<=r;i++)
22         for(int j=1;j<=c;j++)
23             scanf("%d",&a[i][j]);
24     for(int i=1;i<=r;i++)
25         for(int j=1;j<=c;j++)
26             dfs(i,j);
27     cout<<maxx;
28     return 0;
29 }

 

posted @ 2021-08-22 14:58  Rekord  阅读(386)  评论(0编辑  收藏  举报