滑雪

【题目描述】

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;
}
posted @ 2016-05-15 17:20  前前前世。  阅读(191)  评论(0编辑  收藏  举报