zoukankan      html  css  js  c++  java
  • POJ -- 1088 滑雪

    滑雪
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 71659   Accepted: 26468

    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

    思路:记忆化搜索 + DP,


     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #define MAX 105
     5 using namespace std;
     6 const int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
     7 int map[MAX][MAX], vis[MAX][MAX], h[MAX][MAX];
     8 void dfs(int x, int y){
     9     for(int i = 0;i < 4;i ++){
    10         int xx = x + dir[i][0];
    11         int yy = y + dir[i][1];
    12         if(map[xx][yy] != -1 && map[x][y] > map[xx][yy]){
    13             if(!vis[xx][yy]){
    14                 dfs(xx, yy);
    15                 h[x][y] = max(h[x][y], h[xx][yy] + 1);
    16                 vis[x][y] = 1;
    17             }else{
    18                 h[x][y] = max(h[xx][yy] + 1, h[x][y]);
    19                 continue;
    20             }
    21         }
    22     }
    23 }
    24 int main(){
    25     int R, C, ans;
    26     freopen("in.c", "r", stdin);
    27     while(cin >> R >> C){
    28         memset(map, -1, sizeof(map));
    29         memset(vis, 0, sizeof(vis));
    30         for(int i = 1; i<= R;i ++){
    31             for(int j = 0;j <= C;j ++)
    32                 h[i][j] = 1;
    33         }
    34         ans = -1;
    35         for(int i = 1;i <= R;i ++)
    36             for(int j = 1;j <= C;j ++)
    37                 cin >> map[i][j];
    38         for(int i = 1;i <= R;i ++){
    39             for(int j = 1;j <= C;j ++){
    40                 if(!vis[i][j])
    41                     dfs(i, j);
    42             }
    43         }
    44         for(int i = 1;i <= R;i ++){
    45             for(int j = 1;j <= C;j ++)
    46                 ans = max(h[i][j], ans);
    47         }
    48         cout << ans << endl;
    49     }
    50     return 0;
    51 }



  • 相关阅读:
    [note]抽象类和接口的相同点和不同点
    百度竞价门再跟踪:违规医疗广告数量仍大幅增加
    获取拼音的第一个字母的方法
    一个分页存储过程
    正则表达式(Regular Expressions)
    四个故事
    Oracle 常用
    我很喜欢的一个[帖子]:从现在起,我开始还债。
    DataGrid 中的 HyperLinkColumn (可以携带多个Get参数)
    100 statements in English.
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3615938.html
Copyright © 2011-2022 走看看