Michael喜欢滑雪百这并不奇怪(记忆化搜索)

本文介绍了一个滑雪路径寻找问题,通过记忆化搜索算法找到二维数组中从任一点出发所能经过的最长递减路径。该问题涉及数组操作、路径查找及算法优化。

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更长。事实上,这是最长的一条。Input输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。Output输出最长区域的长度。
Sample Input
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
Sample Output
25

题解;记忆化搜索找到最大值。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;
int dp[110][110];
int a[110][110];
int to[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
bool judge(int x,int y)  //判断是否在范围内
{
    if(x>=1&&x<=n&&y>=1&&y<=m)
    return 1;
    else
    return 0;
}
int find(int x,int y)     //找出从该点开始能进行的最大次数
{
    if(dp[x][y])       
    return dp[x][y];
    int d=1,k,tx,ty;
    for(k=0;k<4;k++)
    {
        tx=x+to[k][0];
        ty=y+to[k][1];
        if(judge(tx,ty)&&a[x][y]>a[tx][ty]) 
        d=max(find(tx,ty)+1,d);   
    }
    dp[x][y]=d;  
    return d;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
  	memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        int i,j;
        for(i=1;i<=n;i++)
         for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
        int s=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            s=max(find(i,j), s);
        printf("%d\n",s);
    }
    return 0;
}
### 回答1: :Michael likes skiing, which is not surprising because skiing is indeed very exciting. However, in order to gain speed, the area you ski on must slope downwards, and when you reach the bottom of the slope, you have to climb up again or wait for a lift to carry you. Michael wants to know the longest downhill slope in a given area. The area is given by a two-dimensional array, where each number represents the height of a point. Here is an example: ### 回答2: 滑雪是一项非常刺激的运动,它需要滑雪者不断挑战自己的极限,追求速度和刺激。在滑雪的过程中,为了获得速度区域必须向下倾斜。而且,当你到坡底时,你必须再次走上坡或等待升降机来搭载你。因此,要想得更长、更快,就需要找到具备最长坡的区域。 对于Michael来说,要找到载一个区域中最长底坡,就需要先了解这个区域的地形。在题目中,这个区域由一个二维数组给出,数组中的每个数字代表这个点的高度。因此,杨辉需要先通过这个二维数组找出区域中的最高点和最低点,然后在这个范围内不断进行试探,寻找最长的坡。 例如,在下面的这个二维数组中,最高点为9,最低点为1。 7 2 3 6 9 5 8 4 1 接下来,就需要在这个范围内不断试探,找到最长的坡。具体的操作方法可以是,在每个点向周围的点进行比较,找出高度最低的点,然后继续向下,直到到达底部或者无法继续下为止。记录下每个点的坡长度,并与之前的结果进行比较,找到最长的坡。 通过这种方法,可以找到这个区域中的最长坡。如果有多个最长的坡,就需要记录它们的起点和终点,并输出它们的起点、终点和长度。 ### 回答3: 题目要求我们在一个二维数组中找到一个区域的最长坡。首先,我们需要明确坡的定义。坡是指从高处向低处行的路径。因此,在寻找最长坡的过程中,我们需要找到区域中的最高点,并以此为起点,逐渐向低处行。 由于我们需要寻找最高点,因此可以通过遍历整个数组来找到二维数组中最大的数值。得到最高点的坐标以后,我们可以将其作为起点,向周围低于此点高度的方向进行搜索。具体实现时,我们可以使用深度优先搜索或广度优先搜索算法,以便找到从最高点开始最长的坡。 在搜索过程中,我们需要确定一个方向来进行搜索。可以选择上、下、左、右四个方向进行尝试。如果某个方向可以继续行,则继续向该方向前进。如果不行,就尝试其他方向,直到所有的方向都被尝试过。 在行的过程中,我们需要记录当前的坡长度。一旦找到一个新的下降点,就可以计算这段坡的长度。如果该长度大于之前找到的最长坡长度,则更新最长坡长度。 最后,我们需要注意的是,如果在整个区域中没有下降点,那么无法形成坡。因此,在最长坡的搜索过程中,需要对这种情况进行特判。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值