zoukankan      html  css  js  c++  java
  • POJ 1088 滑雪 【记忆化搜索经典】

    题目链接:http://poj.org/problem?id=1088

    滑雪

    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 107380   Accepted: 40919

    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

    Source

    解题思路:

    有意思的一道题目,DFS 上下左右搜,记录当前点的最优值。

    注意范围:一开始把高度最低的点设为终点,显然这样是不对的,因为可能最后到达次低点的路径更长,或者到达次次低点的路径更长。所以终点就是最后不能再滑的点,无需预先找出来标记,最后在总的路径长度基础上加一即可。

    AC code:

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 #define ll long long int
     7 #define INF 0x3f3f3f3f
     8 using namespace std;
     9 
    10 const int MAXN = 102;
    11 int mmp[MAXN][MAXN];
    12 int d[MAXN][MAXN];
    13 int N, M;
    14 bool ok(int x, int y)
    15 {
    16     if(x > 0 && x <= N && y > 0 && y <= M) return true;
    17     else return false;
    18 }
    19 int dfs(int x, int y)
    20 {
    21     if(d[x][y]) return d[x][y];
    22     if(ok(x-1, y) && mmp[x-1][y]<mmp[x][y])
    23     {
    24         int len = dfs(x-1, y)+1;
    25         if(len > d[x][y]) d[x][y] = len;
    26     }
    27     if(ok(x+1, y) && mmp[x+1][y]<mmp[x][y])
    28     {
    29         int len = dfs(x+1, y)+1;
    30         if(len > d[x][y]) d[x][y] = len;
    31     }
    32     if(ok(x, y-1) && mmp[x][y-1]<mmp[x][y])
    33     {
    34         int len = dfs(x, y-1)+1;
    35         if(len > d[x][y]) d[x][y] = len;
    36     }
    37     if(ok(x, y+1) && mmp[x][y+1]<mmp[x][y])
    38     {
    39         int len = dfs(x, y+1)+1;
    40         if(len > d[x][y]) d[x][y] = len;
    41     }
    42     return d[x][y];
    43 }
    44 
    45 int main()
    46 {
    47     int ans = 0;
    48     scanf("%d%d", &N, &M);
    49     for(int i = 1; i <= N; i++)
    50     for(int j = 1; j <= M; j++)
    51     {
    52         scanf("%d", &mmp[i][j]);
    53     }
    54     for(int i = 1; i <= N; i++)
    55     for(int j = 1; j <= M; j++)
    56         ans = max(ans, dfs(i, j));
    57     printf("%d
    ", ans+1);
    58     return 0;
    59 }
  • 相关阅读:
    启动容器失败:endpoint with name cop already exists in network host.
    docker定时任务执行脚本报错:the input device is not a TTY
    期末总结
    云图学习
    豆瓣top250
    爬取学习
    爬取图片
    爬取学习bs4
    爬取学习 屠戮盗版天堂
    爬取学习
  • 原文地址:https://www.cnblogs.com/ymzjj/p/9496966.html
Copyright © 2011-2022 走看看