滑雪 ( bfs+记忆化
https://www.luogu.org/problemnew/show/P1434 题目
1 #include<iostream> 2 #include<cstdio> 3 #include <cctype> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const int INF= 0x3f3f3f3f; 20 const int N=1e7+5; 21 22 int n,m,mp[105][105]; 23 int vis[105][105]={0}; //vis[i][j]表示(i,j)这点能产生的最大步数 24 int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; 25 struct node 26 { 27 int x,y,s; 28 }a,b; 29 30 void bfs(int nx,int ny) 31 { 32 queue<node>q; 33 a.x=nx; a.y=ny;a.s=1; 34 q.push(a); 35 36 while(!q.empty()) 37 { 38 a=q.front(); 39 q.pop(); 40 for(int i=0;i<4;i++) 41 { 42 b.x=a.x+dx[i]; 43 b.y=a.y+dy[i]; 44 if( mp[a.x][a.y]<=mp[b.x][b.y] ||b.x<1||b.x>n||b.y<1||b.y>m) 45 continue; 46 if(!vis[b.x][b.y]) //if...else 这里记忆化,不然直接bfs会超时 47 { 48 b.s=a.s+1; 49 q.push(b); 50 } 51 else 52 b.s=a.s+vis[b.x][b.y]; 53 54 vis[nx][ny]=max(vis[nx][ny], b.s); 55 } 56 } 57 } 58 59 int main() 60 { 61 cin>>n>>m; 62 for(int i=1;i<=n;i++) 63 for(int j=1;j<=m;j++) scanf("%d",&mp[i][j]); 64 65 int ans=1; //从1开始 66 for(int i=1;i<=n;i++) 67 { 68 for(int j=1;j<=m;j++) 69 { 70 bfs(i,j); 71 ans=max(ans,vis[i][j]); 72 } 73 } 74 cout<<ans; 75 }