• [BFS]P1434 [SHOI2002]滑雪


    P1434 [SHOI2002]滑雪

    Description

    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

    解析
    这道题可以采用记忆化搜索,通过vx和vy来确定一个点(n[x][y])的上下左右的点(h[vx][vy])。再判断有没有越界,再判断能不能从h[vx][vy]到n[x][y]。如果能,就取上下左右的点中最大的值。

    代码

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    int xx,yy;
    int n[105][105],h[105][105],ans=0;
    const int dx[5]={0,1,-1,0,0}; //上下左右移动时x的变化
    const int dy[5]={0,0,0,-1,1}; //上下左右移动时y的变化
    int bq(int x,int y){
    	if(h[x][y])return h[x][y]; //当这个点已经有值了,说明前面已经计算过了,就不重复计算。
    	for(int i=1;i<=4;i++){ //四个可以延伸的方向
    		int vx=x+dx[i]; //上下左右的点的x的坐标
    		int vy=y+dy[i]; //上下左右的点的y的坐标
    		if(vx>0 and vx<=xx and vy>0 and vy<=yy) //判断有没越界
    		 if(n[x][y]>n[vx][vy]) //判断能不能从那边过来
    		  h[x][y]=max(h[x][y],bq(vx,vy)+1); //取最大的值
    	}
    	return h[x][y]; //华丽的结束
    }
    int main(){
    	scanf("%d%d",&xx,&yy); //输入行数和列数
    	for(int i=1;i<=xx;i++)
    	 for(int j=1;j<=yy;j++)
    	  scanf("%d",&n[i][j]); //输入区域的高度
    	for(int i=1;i<=xx;i++)
    	 for(int j=1;j<=yy;j++)ans=max(ans,bq(i,j)+1); //从所有点中找最大值
    	printf("%d",ans); //完美地输出答案
    	return 0; //结束程序
    }
    
  • 相关阅读:
    RabbitMQ 集群与高可用配置
    ManifoldJS
    Top JavaScript Frameworks, Libraries & Tools and When to Use Them
    AngularJS 的安全Apply
    node js 常用模块
    微软发布了ASP.NET WebHooks预览版
    leaflet 了解
    messagepcak 资料
    fastBinaryJSON
    jQuery的图像裁剪插件Jcrop
  • 原文地址:https://www.cnblogs.com/luojunhang/p/12300164.html
Copyright © 2020-2023  润新知