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

    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

    分析
    记忆化搜索。高度比当前格大的格子不用走下去。
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include <queue>
    #include <vector>
    #include<bitset>
    #include<map>
    #include<deque>
    using namespace std;
    typedef long long LL;
    const int maxn = 1e4+5;
    const int mod = 77200211+233;
    typedef pair<int,int> pii;
    #define X first
    #define Y second
    #define pb push_back
    //#define mp make_pair
    #define ms(a,b) memset(a,b,sizeof(a))
    const int inf = 0x3f3f3f3f;
    #define lson l,m,2*rt
    #define rson m+1,r,2*rt+1
    typedef long long ll;
    #define N 100010
    int r,c;
    int dp[105][105];
    int a[105][105];
    
    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,1,-1};
    
    int dfs(int x,int y){
        if(dp[x][y]) return dp[x][y];
        for(int i=0;i<4;i++){
            int tx=x+dx[i];
            int ty=y+dy[i];
            if(tx<1||tx>r||ty<1||ty>c) continue;
            if(a[x][y]>a[tx][ty]) dp[x][y]=max(dp[x][y],dfs(tx,ty)+1);
        }
        return dp[x][y];
    }
    
    int main(){
        while(~scanf("%d%d",&r,&c)){
            for(int i=1;i<=r;i++)
                for(int j=1;j<=c;j++)
                    scanf("%d",&a[i][j]);
            ms(dp,0);
            int ans=-1;
            for(int i=1;i<=r;i++){
                for(int j=1;j<=c;j++){
                    ans=max(ans,dfs(i,j));
                }
            }
            cout<<ans+1<<endl;
        }
        return 0;
    }
     
  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/fht-litost/p/8858076.html
Copyright © 2011-2022 走看看