题目
说明
香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值
跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳.
香穗子可以从任意的格子出发,在任意的格子结束,
那么她最多能跳几次?
输入格式
第一行n,m,表示田野的长和宽
接下来n行,每行m个数,表示该格的价值
输出格式
一个数,表示最多跳得次数
样例
输入数据 1
2 2
2 5
-1 3
输出数据 1
2
提示
n,m<=100
答案保正小于Maxlongint
思路
暴力枚举香穗子的起点,然后dfs,并将最多步数储存在s中,最后与ans取最大值,输出ans即可。
注意:在这里dfs要加上记忆化来优化,且不需要vis数组(因为题目的限制条件

限定了她不能往回走。)
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int s,ans,sx,sy,dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1},n,m,a[101][101],jyh[101][101];
int dfs(int x,int y,int p)
{
if(jyh[x][y] != -1)
{
s = max(s,jyh[x][y] + p);
return jyh[x][y];
}
int t = x,tt = y,k = 0;
s = max(s,p);
for(int i = 0; i < 4; i++)
{
x = t;
y = tt;
int nx = t + dx[i];
int ny = tt + dy[i];
if(a[nx][ny] > a[x][y] && nx >= 0 && nx < n && ny >= 0 && ny < m) k = max(k,dfs(nx,ny,p + 1) + 1);
}
jyh[x][y] = k;
return k;
}
signed main()
{
int p,q;
cin>>p>>q;
n = max(p,q);
m = min(p,q);
for(int i = 0; i < n ; i++)
for(int j = 0; j < m ; j++)
{
cin>>a[i][j];
jyh[i][j] = -1;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
s = 0;
jyh[i][j] = dfs(i,j,0);
ans = max(ans,s);
}
cout<<ans<<endl;
return 0;
}