/*想着蓝桥杯还有20天左右就开始了,计划是把历年真题都敲一遍,再把之前写过的NYOJ的题目重新的复习一下,并且就是把所有写过的题重新的整理到博客上面来,这是开始的第一篇博客,接下来我会好好的整理好我的博客,养成一个良好的代码风格,跟复习习惯,一步一步的成长,慢慢的挣扎,直到有一天,可以以长剑啸天*/
/*为准备蓝桥,因为只能使用dev-c++的编译器,所以逼着自己使用这个编译器*/
/*这道题记忆化搜索的整体思路就是能搜索的方向就进行搜索,搜索返回后取一层最大的数,而不是去选择旁边的梯度来搜索,这样并不表明就一定是最大的*/
skiing
时间限制:3000 ms | 内存限制:65535 KB
难度:5
描述
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。
输入
第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
后面是下一组数据;
输出
输出最长区域的长度。
样例输入
1
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
样例输出
25
#include <iostream>
#include<algorithm>
using namespace std;
int map[100 + 10][100 + 10];
int dp[100 + 10][100 + 10];
int dx[] = { -1,0,0,1 };
int dy[] = { 0,-1,1,0 };
int r, c;
int ans;
int dfs(int x, int y)
{
if (dp[x][y])
return dp[x][y];
else
{
int t, tmp=1;
for (int k = 0; k<4; k++)
{
int nx = x + dx[k];
int ny = y + dy[k];
if (map[nx][ny]>map[x][y])
{
t = dfs(nx, ny) + 1;
tmp = max(tmp, t);
}
}
dp[x][y] = tmp;
return dp[x][y];
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
ans = 0;
memset(map, -1, sizeof(map));
memset(dp, 0, sizeof(dp));
cin >> r >> c;
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
cin >> map[i][j];
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
{
dp[i][j] = max(dp[i][j], dfs(i, j));
ans = max(ans, dp[i][j]);
}
printf("%d\n", ans);
}
return 0;
}