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 }