1 solutions
-
0
暴力枚举
#include<bits/stdc++.h> using namespace std; const int N=310; int h[N][N]; int dx[]={-1,1,0,0}; int dy[]={0,0,-1,1}; int n,m; int dfs(int x,int y) { int now=1; for(int i=0;i<4;i++) { int a=x+dx[i],b=y+dy[i]; if(a<1||a>n||b<1||b>m) continue; if(h[x][y]>h[a][b]) //可以从(x,y)->(a,b) { now=max(now,dfs(a,b)+1); } } return now; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>h[i][j]; } } int ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { ans=max(ans,dfs(i,j)); } } cout<<ans; return 0; }记忆化搜索
#include<bits/stdc++.h> using namespace std; const int N=310; int h[N][N],f[N][N]; int dx[]={-1,1,0,0}; int dy[]={0,0,-1,1}; int n,m; int dfs(int x,int y) { if(f[x][y]!=-1) return f[x][y];//已经计算出答案(剪枝5:记忆化搜索) f[x][y]=1; for(int i=0;i<4;i++) { int a=x+dx[i],b=y+dy[i]; if(a<1||a>n||b<1||b>m) continue;//(越界)可行性剪枝 if(h[a][b]>=h[x][y]) continue;//(不是向下滑)可行性剪枝 f[x][y]=max(f[x][y],dfs(a,b)+1); } return f[x][y]; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>h[i][j]; } } memset(f,-1,sizeof f); int ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { ans=max(ans,dfs(i,j)); } } cout<<ans; return 0; }
- 1
Information
- ID
- 394
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 8
- Tags
- # Submissions
- 14
- Accepted
- 6
- Uploaded By