滑雪 ( 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 }

 

posted @ 2018-07-28 17:21  木流牛马  阅读(255)  评论(0编辑  收藏  举报