洛谷P1434 [SHOI2002]滑雪
https://www.luogu.org/problem/P1434 记忆化搜索
1.
#include<bits/stdc++.h> using namespace std ; int n,m; const int N=10010; int a[N][N],s[N][N]; int ans; int dx[4]= {0,0,1,-1}; int dy[4]= {1,-1,0,0}; int dfs(int x,int y) { if(s[x][y]) return s[x][y]; s[x][y]=1; for(int i=0; i<4; i++) { int xx=dx[i]+x; int yy=dy[i]+y;//四个方向 if(xx>0&&yy>0&&xx<=n&&yy<=m&&a[x][y]>a[xx][yy]) { dfs(xx,yy); s[x][y]=max(s[x][y],s[xx][yy]+1); } } return s[x][y]; } int main() { cin>>n>>m; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin>>a[i][j]; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) ans=max(ans,dfs(i,j)); cout<<ans; return 0; }
2.
#include<bits/stdc++.h> using namespace std; const int maxn = 200; const int dx[]= {0,0,1,-1}; const int dy[]= {1,-1,0,0}; int r,c,ans; int a[maxn][maxn],step[maxn][maxn]; int dfs(int x,int y) { if(step[x][y]) return step[x][y]; step[x][y]=1; for(int i=0; i<4; i++) { int nx=x+dx[i],ny=y+dy[i]; if(a[nx][ny]<a[x][y]) { step[x][y]=max(step[x][y],1+dfs(nx,ny)); } } return step[x][y]; } int main() { cin>>r>>c; for(int i=0; i<=c+1; i++) //设置边界 a[i][0]=a[i][c+1]=1e9; for(int i=0; i<=r+1; i++) a[0][i]=a[r+1][i]=1e9; for(int i=1; i<=r; i++) for(int j=1; j<=c; j++) scanf("%d",&a[i][j]); for(int i=1; i<=r; i++) for(int j=1; j<=c; j++) ans=max(dfs(i,j),ans); cout<<ans; return 0; }