题目描述
香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过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 }