zoukankan      html  css  js  c++  java
  • 滑雪(dp)

    滑雪(dp)

    问题 H: 【例9.24】滑雪

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 21  解决: 13

    题目描述

    小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡。滑坡的长度由滑过点的个数来计算,区域由一个二维数组给出,数组的每个数字代表点的高度。下面是一个例子:

    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-24-17-16-1(从25开始到1结束),当然25-24……2-1更长,事实上这是最长的一条。

    输入

    输入的第一行为表示区域的二维数组的行数R和列数C(1≤R、C≤100),下面是R行,每行有C个数代表高度。

     

    输出

    输出区域中最长的滑坡长度。

     

    样例输入

    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>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m;
    int h[505][505];
    int a[505][505];
    int dp[250005];
    int di[4][2] = {1,0,-1,0,0,1,0,-1}; 
    struct point{
        int hi;
        int x,y;
    }p[250005];
    bool cmp(point p1,point p2)
    {
        return p1.hi<p2.hi;
    }
    bool ok(int x1,int y1)
    {
        if(x1>=1&&x1<=n&&y1>=1&&y1<=m)
            return true;
        else
            return false;
    }
     
    int main()
    {
        cin>>n>>m;
        int k=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {           
                cin>>h[i][j];
                p[k].hi=h[i][j];
                p[k].x=i;
                p[k].y=j;
                dp[k]=1;
                a[i][j]=k++;
                 
            }
        }
        sort(p+1,p+n*m+1,cmp);
        int xx,yy;
        int f=0;
        for(int i=1;i<=n*m;i++)
        {
            if(i==7)
                f=1;
            for(int j=0;j<4;j++)
            {
                xx=p[i].x+di[j][0];
                yy=p[i].y+di[j][1];
                if(ok(xx,yy))
                {
                    int bh=a[xx][yy];
                    int ybh=a[p[i].x][p[i].y];
                    if(h[xx][yy]<h[p[i].x][p[i].y])
                    {
                        dp[ybh]=max(dp[ybh],dp[bh]+1);
                    }
                }
            }
        }
        int ma=0;
        for(int i=1;i<=n*m;i++) ma=max(ma,dp[i]);
        cout<<ma;
             
                 
        return 0;
    }
     
    [提交][状态][Edit] [TestData]
  • 相关阅读:
    [BZOJ 1698] 荷叶池塘
    [BZOJ 3132] 上帝造题的七分钟
    [JLOI2011] 飞行路线
    [Codeforces Round49F] Session in BSU
    [BZOJ 3036] 绿豆蛙的归宿
    CRC-16校验原理
    ubuntu下mysql的安装与配置
    【OpenCV】边缘检测:Sobel、拉普拉斯算子
    我对sobel算子的理解
    梯度算子(普通的+Robert + sobel + Laplace)
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13270783.html
Copyright © 2011-2022 走看看