题目描述
香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值
跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳.
香穗子可以从任意的格子出发,在任意的格子结束,
那么她最多能跳几次?
输入输出格式
输入格式:
第一行n,m,表示田野的长和宽
接下来n行,每行m个数,表示该格的价值
输出格式:
一个数,表示最多跳得次数
输入输出样例
输入样例#1:
2 2 2 5 -1 3
输出样例#1:
2
说明
n,m<=100
答案保证小于Maxlongint
记忆化搜索
#include <cstdio> long long f[1510][1510],value[1510][1510]; long long n,m,maxn=-1; long long fx[5]={1,-1,0,0},fy[5]={0,0,-1,1}; long long max(long long a,long long b) { return a>b?a:b; } long long qr(long long &x) { x=0;bool f=1; char ch=getchar(); while(ch>'9'||ch<'0') { if(ch=='-') f=0; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+(long long)ch-48; ch=getchar(); } x=f?x:(~x)+1; } long long dfs(long long u,long long v) { if(f[u][v]) return f[u][v]; long long p=0; for(long long i=0;i<4;++i) { long long x=u+fx[i],y=v+fy[i]; if(x>=1&&x<=n&&y>=1&&y<=m&&value[x][y]>value[u][v]) p=max(dfs(x,y),p); } f[u][v]=p+1; return f[u][v]; } int main() { qr(n); qr(m); for(long long i=1;i<=n;i++) for(long long j=1;j<=m;++j) qr(value[i][j]); for(long long i=1;i<=n;i++) for(long long j=1;j<=m;++j) maxn=max(maxn,dfs(i,j)); printf("%lld",maxn-1); return 0; }