香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值
跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳.
香穗子可以从任意的格子出发,在任意的格子结束,
那么她最多能跳几次?
输入格式:
第一行n,m,表示田野的长和宽
接下来n行,每行m个数,表示该格的价值
输出格式:
一个数,表示最多跳得次数
输入样例#1:
2 2
2 5
-1 3
输出样例#1:
2
n,m<=100
答案保证小于Maxlongint
决定了,
以后能写记忆化搜索的写记忆化搜索
不能写记忆化搜索的也写记忆化搜索!
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<queue>
6 #include<algorithm>
7 #define lli long long int
8 using namespace std;
9 const int MAXN=101;
10 void read(lli &n)
11 {
12 char c='+';lli x=0;bool flag=0;
13 while(c<'0'||c>'9')
14 {c=getchar();if(c=='-')flag=1;}
15 while(c>='0'&&c<='9')
16 {x=x*10+(c-48);c=getchar();}
17 flag==1?n=-x:n=x;
18 }
19 lli n,m;
20 lli map[MAXN][MAXN];
21 lli ans[MAXN][MAXN];
22 lli xx[5]={-1,+1,0,0};
23 lli yy[5]={0,0,-1,+1};
24 lli M_S(lli x,lli y)
25 {
26 if(ans[x][y])
27 return ans[x][y];
28 for(lli i=0;i<4;i++)
29 {
30 lli wx=x+xx[i];
31 lli wy=y+yy[i];
32 if(map[wx][wy]>map[x][y]&&wx>=1&&wy>=1&&wx<=n&&wy<=m)
33 ans[x][y]=max(ans[x][y],M_S(wx,wy)+1);
34 }
35 return ans[x][y];
36 }
37 int main()
38 {
39 read(n);read(m);
40 for(lli i=1;i<=n;i++)
41 for(lli j=1;j<=m;j++)
42 read(map[i][j]);
43 for(lli i=1;i<=n;i++)
44 for(lli j=1;j<=m;j++)
45 if(!ans[i][j])
46 M_S(i,j);
47 lli out=-1;
48 for(lli i=1;i<=n;i++)
49 for(lli j=1;j<=m;j++)
50 out=max(out,ans[i][j]);
51 printf("%d",out);
52 return 0;
53 }