zoukankan      html  css  js  c++  java
  • 百练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更长。事实上,这是最长的一条。输入输入的第一行表示区域的行数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

    来源Don't know

    递推型动态规划,确定递推的顺序很重要

    AC code:

    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<map>
    #include<cstring>
    #define DEBUG(x) cout << #x << " = " << x << endl
    using namespace std;
    const int MAXN=110;
    int R,C;
    int field[MAXN][MAXN];
    int len[MAXN][MAXN];
    ///将所有点从小到大排序
    struct Point{
        int h, i, j;
        Point(){}
        Point(int h,int i,int j){
            this->h=h;
            this->i=i;
            this->j=j;
        }
        bool operator<(const Point &p)const
        {
            return h<p.h;
        }
    };
    int PN=0;
    Point points[MAXN*MAXN];
    int main()
    {
    //    freopen("in.txt","r",stdin);
        scanf("%d %d",&R,&C);
        for(int i=0;i<R;i++){
            for(int j=0;j<C;j++){
                int h;
                scanf("%d",&h);
                field[i][j]=h;
                points[PN++]=Point(h,i,j);
                len[i][j]=1;
            }
        }
        sort(points,points+PN);
        int r=-1;
        ///人人为我型递推
        for(int k=0;k<PN;k++){
            int i=points[k].i,
            j=points[k].j,
            h=points[k].h;
            if(i+1<R&&field[i+1][j]<field[i][j])len[i][j]=max(len[i][j],len[i+1][j]+1);
            if(i-1>=0&&field[i-1][j]<field[i][j])len[i][j]=max(len[i][j],len[i-1][j]+1);
            if(j+1<C&&field[i][j+1]<field[i][j])len[i][j]=max(len[i][j],len[i][j+1]+1);
            if(j-1>=0&&field[i][j-1]<field[i][j])len[i][j]=max(len[i][j],len[i][j-1]+1);
            r=max(r,len[i][j]);
        }
        printf("%d
    ",r);
        return 0;
    }
  • 相关阅读:
    Mvc+三层(批量添加、删除、修改)
    js中判断复选款是否选中
    EF的优缺点
    Git tricks: Unstaging files
    Using Git Submodules
    English Learning
    wix xslt for adding node
    The breakpoint will not currently be hit. No symbols have been loaded for this document."
    Use XSLT in wix
    mfc110ud.dll not found
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9161857.html
Copyright © 2011-2022 走看看