题目1滑雪
- 问题描述
Glory非常喜欢玩滑滑梯游戏,下面给出了一个n,m的滑道,其中的数字表示滑道的高度。Glory可以从一个点出发向下滑行,每次只能滑行到相邻的位置(上下左右)中高度严格低于当前高度的地方,不能重复划行已经滑行过的地方,但他希望在这个滑道上滑行尽量远的距离,也即是找一条最长的滑道。
Input
第一行输入两个数n,m代表滑梯范围行n和列m(1 <= n,m <= 100)。下面是n行,每行有m个整数,代表高度h,(0<=h<=20000)
Output
输出一个值,代表Glory能够在滑滑梯上面滑行的最长长度是多少
Sample Input
3 3
9 1 2
5 6 7
8 4 3
Sample Output
4
Sample Input
4 7
7 6 5 4 3 2 1
1 5 1 1 1 1 1
1 4 3 1 1 1 1
1 5 6 7 8 1 1
Sample Output
7
hint
样例1:7->6->4->3 长度为4
2.算法
算法1解题思路
采用了dfs的用法,图的遍历,记忆记忆划搜索,运用dfs找最长路径
算法1.源代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,m;
int dp[110][110];//记忆
int a[110][110];//存图
int dir[4][2]={-1,0,0,1,1,0,0,-1};//方向
int dfs(int x,int y)
{
if(dp[x][y]) return dp[x][y];//如果之前标记过 返回dp值
int maxlen = 1;//定义最长长度
int len;//当前长度
for(int i = 0; i < 4; i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(tx > 0 && tx <= n && ty > 0 && ty <= m && a[tx][ty] < a[x][y])
{
len = dfs(tx,ty) + 1 ;//满足情况则步数加1
maxlen = max( len , maxlen ); //最长步数进行更新
}
}
return dp[x][y] = maxlen; //把改点的步数进行标记
}
int main()
{
cin>>n>>m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
cin>>a[i][j];//输入图
}
memset(dp,0,sizeof(dp));//进行清零
int ans = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
dp[i][j] = dfs(i,j);//对每一个点进行遍历,
ans = max(ans,dp[i][j]);//寻找 步数最长步数
}
printf("%d\n",ans);
return 0;
}
- 总结
记忆化搜索即使对之前经过的点进行需要对记忆数组进行重新赋值,每输入一次即寻找一次该点的最长路径