• 滑雪


    【题目描述】

    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

    当且仅当高度减小时,Michael可以从某个点滑向上下左右相邻的四个点之一。在上面的例子中,一条可滑行的滑坡为24-17-16-1,25-24-23-······-3-2-1是最长的一条滑坡。

    【输入描述】

    第一行输入两个整数R、C(1 <= R,C <= 100),表示区域行数及列数;

    接下来R行,每行输入C个整数,表示该点的高度H(0 <= H <= 10000)。

    【输出描述】

    输出一个数,表示最长滑坡的长度。

    【输入样例】

    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<cstdio>
    int m,n,ans(0),i[101][101],f[101][101]={0};
    int DFS(int x,int y) //记忆化搜索。
    {
        if (f[x][y]) //若已被搜索过,则返回其值。
          return f[x][y];
        int num=1; //其本身。
        if (x<n&&i[x][y]>i[x+1][y]) //注意限制边界。
        {
            int t=DFS(x+1,y)+1; //比较大小,注意其本身。
            if (t>num)
              num=t;
        }
        if (x>1&&i[x][y]>i[x-1][y])
        {
            int t=DFS(x-1,y)+1;
            if (t>num)
              num=t;
        }
        if (y<m&&i[x][y]>i[x][y+1])
        {
            int t=DFS(x,y+1)+1;
            if (t>num)
              num=t;
        }
        if (y>1&&i[x][y]>i[x][y-1])
        {
            int t=DFS(x,y-1)+1;
            if (t>num)
              num=t;
        }
        return f[x][y]=num; //回溯并顺便进行赋值。
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int a=1;a<=n;a++)
          for (int b=1;b<=m;b++)
            scanf("%d",&i[a][b]);
        for (int a=1;a<=n;a++)
          for (int b=1;b<=n;b++)
          {
            f[a][b]=DFS(a,b);
            if (f[a][b]>ans)
              ans=f[a][b];
          }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    深浅拷贝
    生成式、生成器、迭代对象、迭代器
    memcached
    redis安装配置
    基于docker搭建mysql主从复制架构
    centos 安装 最新版本的docker
    Linux小技巧
    神奇的'license': 'AGPL 3.0'标签报错
    新博客重新开通了
    通过linkserver不能调远程表值函数
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5495581.html
Copyright © 2020-2023  润新知