香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值
跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳.
香穗子可以从任意的格子出发,在任意的格子结束,
那么她最多能跳几次?
输入:
第一行n,m,表示田野的长和宽
接下来n行,每行m个数,表示该格的价值
输出:
一个数,表示最多跳得格数
Sample Input
2 2
2 5
-1 3
Sample Output
3
数据范围:
n,m<=100
答案保正小于Maxlongint
考试的时候这道题跪了…
错得非常二…
在记忆化搜索的时候没有取最大值……(取了最后一个值)
事实上没有什么好说的
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
int X, Y;
int Map[105][105];
const int dx[4] = {0, 0, -1, 1};
const int dy[4] = {1, -1, 0, 0};
int F[105][105];
void init_file()
{
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
}
void read_data()
{
scanf("%d%d", &X, &Y);
for(int i = 1; i <= X; i++)
for(int j = 1; j <= Y; j++)
{
scanf("%d", &Map[i][j]);
}
}
int dfs(int x, int y)
{
if (F[x][y]) return F[x][y];
for(int i = 0; i < 4; i++)
{
int X_ = x + dx[i];
int Y_ = y + dy[i];
if (Map[X_][Y_] > Map[x][y] && X_ >= 1 && X_ <= X && Y_ >= 1 && Y_ <= Y)
{
F[x][y] = max(dfs(X_, Y_) + 1, F[x][y]);
}
}
return F[x][y];
}
void work()
{
int ans = -0x3f3f3f3f;
for(int i = 1; i <= X; i++)
for(int j = 1; j <= Y; j++)
{
ans = max(ans, dfs(i, j));
}
printf("%d\n", ans + 1);
//printf("\n%d\n", dfs(1, 1));
}
int main()
{
init_file();
read_data();
work();
return 0;
}
然后就没有什么要说的了 一定要注意检查