首页 > 其他 > 详细

P1434 [SHOI2002]滑雪

时间:2020-02-17 21:52:17      阅读:44      评论:0      收藏:0      [点我收藏+]

题目描述

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

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度会减小。在上面的例子中,一条可行的滑坡为 2424-1717-1616-11(从 2424 开始,在 11 结束)。当然 2525-2424-2323-\ldots…-33-22-11 更长。事实上,这是最长的一条。

搜索,显而易见。

用dfs显然比较好,因为题目要求的是是一条最长的路径

以17为例:

上面是2,可以走,如果走,17的路径长度=2的路径长度+1(这里的路径长度指的是以这个点为起点的最长路径)

下面是24,不可以走

左面是16,可以走,如果走,17的路径长度=16的路径长度+1

右面是18,不可以走,

再用递归将2和16的情况进行比较,就可以啦!正确性显然

代码如下:

#include<bits/stdc++.h>
using namespace std; 
int a[105][105];//记忆化,记忆路径长度
int mapn[105][105];//地图 
int gg[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; //上下左右,小心打错
int x,y;//地图大小 
int maxn=0;//存储最大长度 
int f(int m,int n)//dfs函数
{
    if(a[m][n]) return a[m][n];//这个点如果被搜索过了,直接返回值,省去了再次查找的时间
    a[m][n]=1;//本身也有长度
    for(int i=0;i<4;i++)
    {
        int mm=m+gg[i][0];
        int nn=n+gg[i][1];
        if(mm>0&&mm<=x&&nn>0&&nn<=y&&mapn[m][n]>mapn[mm][nn])//不能越界,而且要是下坡
        {
            f(mm,nn);//递归
            a[m][n]=max(a[m][n],a[mm][nn]+1);//上面已结释,不多说    
        }
    }
    return a[m][n];//返回长度
}
int main()
{
    cin>>x>>y;//输入地图长度
    for(int i=1;i<=x;i++)
    {
        for(int j=1;j<=y;j++)
        {
            cin>>mapn[i][j];//输入
        }
    } 
    for(int i=1;i<=x;i++)
    {
        for(int j=1;j<=y;j++)
        {
        maxn=max(maxn,f(i,j)); //刷新路径最长长度
        } 
    }
    cout<<maxn;//输出
    return 0; 
} 

这题没有什么坑点,只要思路清晰,明白考点就能写出来啦!

撒花~

P1434 [SHOI2002]滑雪

原文:https://www.cnblogs.com/zhangzhiyuan123/p/12323551.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!